C# 如何将列值保存到SQL C中的变量?
我正在使用WindowsFormsC和SQL。我有一个由两列组成的表: Column1=myID主键和唯一ID 第2列=日期时间 以下代码将日期/时间插入表中: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"
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列作为主键的用途。对不起,你的新问题现在让人怀疑你想做什么