带有标识列的DataGridView

ahmed_one

成员
已加入
2012年11月29日
留言内容
23
编程经验
Beginner
我正在使用Visual Studio 2010,语言C#和SQL Server Express Edition作为后端。 DataGridView控件有一种形式,我使用设计器手动设置了列,然后在运行时设置数据源。

C#:
connectionString = ConfigurationManager.AppSettings["connectionString"];
sqlConnection = new SqlConnection(connectionString);
sqlConnection.Open();
String sqlSelectDet = "Select OrdDetID, OrderID, ProductID, UnitPrice, Quantity from OrderDetails"; 

//===============================================================================
//--- Set up the INSERT Command OrderDetails
//===============================================================================

sDetInsProcName = "prInsert_OrderDetail";
insertcommandDet = new SqlCommand(sDetInsProcName, sqlConnection);
insertcommandDet.CommandType = CommandType.StoredProcedure;

insertcommandDet.Parameters.Add("@nNewDetID", SqlDbType.Int, 4, "OrdDetID");
insertcommandDet.Parameters.Add("@nOrderID", SqlDbType.Int, 4, "OrderID");
insertcommandDet.Parameters.Add("@nProductID", SqlDbType.Int, 4, "ProductID");
insertcommandDet.Parameters.Add("@mUnitPrice", SqlDbType.Money, 8, "UnitPrice");
insertcommandDet.Parameters.Add("@nQuantity", SqlDbType.SmallInt, 2, "Quantity");

sqlDataDet.InsertCommand = insertcommandDet;

如代码所述,我正在使用存储过程prInsert_OrderDetail。 OrdDetID是一种LineItem号,它是数据库中的autoincrement字段。
为了设置DataGridView,我使用以下方法:

C#:
dtDet = new DataTable();
dtDet.Clear(); 
sqlDataDet.FillSchema(dtDet, SchemaType.Source);

ds = new DataSet();
ds.Tables.Add(dtDet);

ds.Tables[1].Columns["OrdDetID"].AutoIncrement = true;
ds.Tables[1].Columns["OrdDetID"].AutoIncrementSeed = -1;
ds.Tables[1].Columns["OrdDetID"].AutoIncrementStep = -1;

bsDet = new BindingSource();
bsDet.DataSource = ds;
bsDet.DataMember = "OrderDetails"; 

// Name of DataGridView Control is dgInvDet
dgInvDet.AutoGenerateColumns = false;
dgInvDet.DataSource = bsDet;
dgInvDet.Columns["OrdDetID"].DataPropertyName = "OrdDetID";
dgInvDet.Columns["OrderID"].DataPropertyName = "OrderID";
dgInvDet.Columns["ProductID"].DataPropertyName = "ProductID";
dgInvDet.Columns["UnitPrice"].DataPropertyName = "UnitPrice";
dgInvDet.Columns["Quantity"].DataPropertyName = "Quantity";

在“保存”按钮单击事件中,以下代码用于将数据从DataGridView保存到数据库:

C#:
sqlDataDet.Update(ds.Tables[0]);

SQL服务器中的存储过程是这样的:

C#:
ALTER  PROCEDURE [dbo].[prInsert_OrderDetail]
@nOrderID INT, 
@nProductID INT, 
@mUnitPrice MONEY, 
@nQuantity SMALLINT,
@nNewDetID INT OUTPUT
AS 
INSERT INTO [OrderDetails] (OrderID, ProductID, UnitPrice, Quantity)
VALUES (@nOrderID, @nProductID, @mUnitPrice, @nQuantity)

SET @nNewDetID = SCOPE_IDENTITY()


数据正确保存在数据库中,我的问题是如何获得OrdDetID实际标识值,将记录插入数据库后,dataGridView在DataGridView中不显示实际值。由于列的设置,我得到的是-1,-2,-3等。我需要OrdDetID将数据从DataGridView批量更新到数据库。


有什么想法/建议吗?



谢谢


Ahmed
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,566
地点
悉尼,澳大利亚
编程经验
10+
您的问题是您用新的ID填充了输出参数,但是,当您在数据适配器上调用Update时,您将无法获取该参数值。实际上,您需要做的是将新ID重新选择到同一DataTable中。如果希望存储过程支持这两个选项,则可以将其更改为:
C#:
ALTER  PROCEDURE [dbo].[prInsert_OrderDetail]
@nOrderID INT, 
@nProductID INT, 
@mUnitPrice MONEY, 
@nQuantity SMALLINT,
@nNewDetID INT OUTPUT
AS 
INSERT INTO [OrderDetails] (OrderID, ProductID, UnitPrice, Quantity)
VALUES (@nOrderID, @nProductID, @mUnitPrice, @nQuantity)

SET @nNewDetID = SCOPE_IDENTITY()
SELECT OrdDetID = SCOPE_IDENTITY()
如果您不需要在其他任何地方使用输出参数,则可以完全取消使用它。

顺便说一句,当您插入订单记录时,您应该做类似的事情。如果单个数据集包含两个相关的数据表,则可以插入订单,自动检索新的ID,自动将其传播到OrderDetail记录,保存它们,然后也自动为其检索新的ID。
 

ahmed_one

成员
已加入
2012年11月29日
留言内容
23
编程经验
Beginner
感谢您的迅速答复,实际上这是您提到的代码的一部分,这是项目的主/明细类型,我可以输入Order,并使用OrderDetails输入所有内容,然后使用前面提到的代码将其保存,OrdDetID是用户输入的每个产品的参考,以便在用户需要更新记录时,我们可以使用OrdDetID(带有OrderID)来更新该产品(例如,单价,价格)。如果有什么更简单的方法,如果您可以教我,或者如果您可以分享与本文讨论的主题相同的示例,我将不胜感激?
 
最佳 底部