2016-04-01 25 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

像黃油一樣工作。非常感謝! –