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

本文关键字:保存 变量 SQL | 更新日期: 2023-09-27 18:27:17

我使用的是windows窗体C#和SQL。我有一张由两列组成的表格:

第1列=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 C#中将列值保存到变量中

在Sql Server(和其他数据库系统)中,可以在同一文本中传递两个命令。现在,T-SQL允许您使用命令"SELECT SCOPE_IDENTITY()"返回为连接生成的最后一个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());
         .... 
     }
}

调用ExecuteScalar而不是ExecuteNonQuery,它返回在此处执行的最后一个命令(SELECT)中第一行的第一列。请注意,将每个一次性对象(如连接和命令)都包含在using语句中是一种很好的做法,以便在出现异常(不要忘记处理这些对象)时为代码提供正确的退出路径

编辑

如果您的ID列不是IDENTITY列而是uniqueidentifier列,则会出现更多问题。我假设您的表已经使用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();
         .... 
     }
}

假设新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逻辑放在按钮单击事件处理程序中-使用单独的类进行数据管理
  • 将命令和连接封装在using块中,以便即使出现异常也能及时关闭它们

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

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