如何在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 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