C# 如何将列值保存到SQL C中的变量?

C# 如何将列值保存到SQL C中的变量?,c#,sql,C#,Sql,我正在使用WindowsFormsC和SQL。我有一个由两列组成的表: Column1=myID主键和唯一ID 第2列=日期时间 以下代码将日期/时间插入表中: private void button1_Click(object sender, EventArgs e) { SqlConnection cn = new SqlConnection("Data Source=PCN-TOSH;Initial Catalog=mydb;Integrated Security=True"

我正在使用WindowsFormsC和SQL。我有一个由两列组成的表:

Column1=myID主键和唯一ID

第2列=日期时间

以下代码将日期/时间插入表中:

 private void button1_Click(object sender, EventArgs e)
    {

 SqlConnection cn = new SqlConnection("Data Source=PCN-TOSH;Initial Catalog=mydb;Integrated Security=True");
         cn.Open();
        SqlCommand cm = new SqlCommand("Insert into TableDate_Time (DateTime ) values (@DateTime)");


        cm.Parameters.Add("@DateTime", SqlDbType.DateTime);
        cm.Parameters["@DateTime"].Value = DateTime.Now;  
         cm.Connection = cn;
         cm.ExecuteNonQuery();

     // something like:  var varID = the current myID value

   }

我的问题是:每次单击按钮时,如何将myID列的最后一行值保存到变量中?有什么想法吗?谢谢

在Sql Server和其他数据库系统中,您可以在同一文本中传递两个命令。现在,T-SQL允许您使用SELECT SCOPE\U IDENTITY命令返回为连接生成的上一个标识值

因此,您的代码将是

private void button1_Click(object sender, EventArgs e)
{
     string cmdText = @"Insert into TableDate_Time 
                       (DateTime ) values (@DateTime);
                       SELECT SCOPE_IDENTITY()");
     using(SqlConnection cn = new SqlConnection("...."))
     using(SqlCommand cm = new SqlCommand(cmdText, cn))
     {
         cn.Open();
         cm.Parameters.Add("@DateTime", SqlDbType.DateTime);
         cm.Parameters["@DateTime"].Value = DateTime.Now;  
         int id = Convert.ToInt32(cm.ExecuteScalar());
         .... 
     }
}
代替ExecuteOnQuery,调用ExecuteScalar,返回在此处执行的最后一个命令中第一行的第一列SELECT。请注意,最好将每个一次性对象(如连接和命令)封装在using语句中,以便在出现异常时为代码提供正确的退出路径—不要忘记处理这些对象

编辑

如果ID列不是标识列,而是唯一标识符,则会出现更多问题。我假设您的表已经使用T-SQL的NEWID函数为列ID定义了一个默认值

在这种情况下,您需要将查询更改为

private void button1_Click(object sender, EventArgs e)
{
     string cmdText = @"Insert into TableDate_Time 
                       (DateTime ) OUTPUT INSERTED.myID values (@DateTime)";
     using(SqlConnection cn = new SqlConnection("...."))
     using(SqlCommand cm = new SqlCommand(cmdText, cn))
     {
         cn.Open();
         cm.Parameters.Add("@DateTime", SqlDbType.DateTime);
         cm.Parameters["@DateTime"].Value = DateTime.Now;  
         Guid id = (Guid)cm.ExecuteScalar();
         .... 
     }
}

那很容易。只需添加以下代码:

private void button1_Click(object sender, EventArgs e)
    {

 SqlConnection cn = new SqlConnection("Data Source=PCN-TOSH;Initial Catalog=mydb;Integrated Security=True");
         cn.Open();
        SqlCommand cm = new SqlCommand("Insert into TableDate_Time (DateTime ) values (@DateTime)");


        cm.Parameters.Add("@DateTime", SqlDbType.DateTime);
        cm.Parameters["@DateTime"].Value = DateTime.Now;  
         cm.Connection = cn;
         int returnValue = 0;
         SqlParameter param = new SqlParameter();
         param.ParameterName = "ReturnParameter";
         param.Direction = ParameterDirection.ReturnValue;
         cm.Parameters.Add(param);

         cm.Connection.Open();
         cm.ExecuteNonQuery();    
   }
并在存储过程或sql查询中添加:

DECLARE @ID int = (Select SCOPE_IDENTITY())

RETURN @ID

假设新ID是通过列默认值在数据库中生成的,则可以使用OUTPUT子句返回新记录的ID:

private void button1_Click(object sender, EventArgs e)
{

    SqlConnection cn = new SqlConnection("Data Source=PCN-TOSH;Initial Catalog=mydb;Integrated Security=True");
    cn.Open();
    SqlCommand cm = new SqlCommand("INSERT INTO TableDate_Time (DateTime) OUTPUT inserted.myID VALUES (@DateTime)");

    cm.Parameters.Add("@DateTime", SqlDbType.DateTime);
    cm.Parameters["@DateTime"].Value = DateTime.Now;  
    cm.Connection = cn;
    Guid newID = (Guid)cm.ExecuteScalar();
}
其他一些需要考虑的事情并不是你的问题:

不要将直接SQL逻辑放在按钮单击事件处理程序中-使用单独的类进行数据管理 使用块包装命令和连接,以便及时关闭它们,即使出现异常。
myID是一个标识栏还是一个唯一标识栏?@Scott Chamberlain。它是uniqueidentifer。您应该在问题中明确说明这一点,带有SCOPE_identifier的答案不适用于此。@naouf该列的默认值是如何定义的?使用NEWID T-SQL函数?@naouf您需要指定新的ID还是有类似NEWID的默认值?我不知道ReturnValue是否适用于文本查询,我想,您需要有cm.CommandType=CommandType.StoredProcedure才能让它工作。ReturnValue参数是从T-SQL中的RETURN语句分配的,而不是从SELECT中分配的。顺便说一句,此代码不返回最后一个标识值,存储过程在哪里?关于存储过程,您是对的。哎呀!也许我应该删除,但我会暂缓,看看OP是否可以澄清。有一件事需要注意,我遇到了一些问题,触发器可能会将查询与直接打印的输出语句搞砸。如果触发器可能在其上,则最好输出到变量,然后在单独的select中打印该变量。需要注意的一件事是,触发器可能会用直接打印的输出语句将查询搞砸。如果触发器可能在其上,则最好输出到变量,然后在单独的select中打印该变量。是的,只需在临时表上进行测试,查看ExecuteScalar是否也返回Guid。太晚了,Stanley先生已经回答了@Steve。您的第一个代码运行得很好,谢谢。最后一个问题:如果myID列从文本框中获取其值,但默认情况下不会自动添加,该怎么办?我们可以使用ExecuteScalar吗;如果没有,用什么。谢谢。如果您的用户为myID列插入了一个值,那么您就不能使用NEWID函数作为默认值的标识列或uniqueidentifier列。您应该将该列更改为整数或nvarchar,并将文本框中键入的值作为另一个参数传递,并相应地更改插入查询,然后使用ExecuteOnQuery。但这可能会破坏myID列作为主键的用途。对不起,你的新问题现在让人怀疑你想做什么