繁体   English   中英

具有身份列的C#DataGridView

[英]C# DataGridView with Identity Column

我正在使用Visual Studio 2010,语言C#和SQL Server Express Edition作为后端。 DataGridView控件有一种形式,我使用设计器手动设置了列,然后在运行时设置数据源。

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,我使用以下方法:

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保存到数据库:

sqlDataDet.Update(ds.Tables[0]);

SQL Server中的存储过程是这样的:

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等。

有什么想法/建议吗?

谢谢

艾哈迈德

这个参数

insertcommandDet.Parameters.Add("@nNewDetID", SqlDbType.Int, 4, "OrdDetID");

需要指定为ParameterDirection.Output ,即类似于以下代码行:

SqlParameter pID = new SqlParameter("nNewDetID", DBType.Int32, 4);
    pID.Direction = ParameterDirection.Output;
    insertcommandDet.Parameters.Add(pID);
    //** other code here...
    insertcommandDet.ExecuteScalar();

执行命令后,可以通过以下方式提取值:

int id = Convert.ToInt32(cmd.Parameters["nNewDetID"].Value.ToString());

您应该能够在控制台应用程序中对此进行测试,以使您开始...

// set connection
            SqlConnection sqlConnection = new SqlConnection("[Your connection string here]");

            // open connection
            sqlConnection.Open();

            // specify the stored procedure which has an output parameter, namely "NewId"
            SqlCommand insertcommandDet = new SqlCommand("[dbo].[TestingSP]", sqlConnection);

            // tell the command that it is a stored procedure
            insertcommandDet.CommandType = CommandType.StoredProcedure;

            // add the parameter having the name
            insertcommandDet.Parameters.AddWithValue("Name","Test Name"); 

            // this parameter will contain the new id after
            SqlParameter pID = new SqlParameter("NewId", SqlDbType.Int, 4);
            pID.Direction = ParameterDirection.Output;

            // add the parameter to the command
            insertcommandDet.Parameters.Add(pID);

            // execute command with ExecuteScalar()
            insertcommandDet.ExecuteScalar();

            // Get parameter value extracted with ExecuteScalar
            int id = Convert.ToInt32(insertcommandDet.Parameters["NewId"].Value.ToString());

我使用的过程如下

create  PROCEDURE [dbo].[TestingSP](
@Name varchar(50) ,
@NewId INT OUTPUT)
AS 
INSERT INTO [Testing]
select @name
    SET @NewId = SCOPE_IDENTITY()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM