2016-04-01 24 views
0

我是C#的新手,对sql命令有点新鲜。我知道如何直接在数据库管理器中编写sql命令,但我一直无法弄清楚如何让它作为C#SqlCommand对象工作。下面是我的表的示例记录:如何在C#中编写特定的sql命令?

+----+----------+----------+----------+ 
| ID | UserId | SiteName | Date  | 
+----+----------+----------+----------+ 
| 1 | 7698479 | Site1 | NULL | 
| 2 | 7698479 | Site2 | NULL | 
| 3 | 7698479 | Site3 | NULL | 
| 4 | 7698479 | Site4 | NULL | 
+----+----------+----------+----------+ 

在我的应用程序中,我有一个按钮。当用户点击按钮时,我希望与特定用户标识关联的整个日期行更新为当前日期。 “extractedId”实际上是我的程序中存储用户标识的变量。所以我的问题是,在C#中这个sql命令的正确语法是什么,特别是考虑到“extractedId”是一个变量?这是我尝试过的代码的变体之一。

SqlCommand myCommand = new SqlCommand("UPDATE myTable SET Date = getdate() WHERE UserId = extractedId", myConnection); 
+0

参见[SqlCommand.ExecuteScalar](https://msdn.microsoft.com/en -us/library/system.data.sqlclient.sqlcommand.executescalar(v = vs.110).aspx)开始。 – Igor

+1

难道他不想使用[SqlCommand.ExecuteNonQuery](https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executenonquery(v = vs.110).aspx) ? ExecuteScalar更适用于在插入行时使用SELECT或ID返回值。使用ExecuteNonQuery,您可以运行提供的SqlCommand。 – Dresden

回答

1

这里有几个例子,你可以使用:

对于止逆使用:

Con.Open(); 
Cmd.CommandText = SQL_command; 
Cmd.ExecuteNonQuery(); 
Con.Close(); 

对于一个返回值使用:

Con.Open(); 
Cmd.CommandText = SqlCommand; 
object Ret = Cmd.ExecuteScalar(); 
Con.Close(); 

对于m ultiple返回值使用:

Con.Open(); 
Cmd.CommandText = SqlCommand; 
SqlDataReader Reader = Cmd.ExecuteReader(); 
List<object[]> Ret = new List<object[]>(); 
int Columns = Reader.FieldCount; 
while (Reader.Read()) 
{ 
    object[] RetItem = new object[Columns]; 
    for (int i = 0; i < Columns; i++) 
    { 
     RetItem[i] = Reader[i]; 
    } 
    Ret.Add(RetItem); 
} 
Reader.Close(); 
Con.Close(); 
3

你需要将它添加到命令来处理相关参数:

var commandText = "UPDATE myTable SET Date = getdate() WHERE UserId = @extractedId"; 
    SqlCommand myCommand = New SqlCommand(commandText); 
    myCommand.CommandType = CommandType.Text; 
    myCommand.CommandTimeout = 300; 
    myCommand.Connection = New SqlConnection(myConnection); 
    myCommand.Parameters.AddWithValue("@extractedId", extractedId) 
    try 
    { 
     var result = myCommand.ExecuteNonQuery(); 
    } 
    catch(Exception e) 
    { 
     //do something with exception 
    } 
    finally 
    { 
    myCommand.Connection.Close() 
    } 
+0

如果更新失败,您实际上可以执行一些错误处理。我喜欢这个例子。有些人在使用ExecuteNonQuery时遇到了捕获错误的某些问题,所以只需注意[Exception not caught](http://stackoverflow.com/questions/27383472/executenonquery-exception-not-caught-by-try-catch) (@ H. NetIrrigate) – Dresden

+0

像黄油一样工作。非常感谢! –