簡體   English   中英

從C#調用存儲過程時出錯

[英]Getting an error when calling stored procedure from C#

從C#調用SQL Server中的存儲過程時出現以下錯誤:

第1行:'spGet_Data'附近的語法不正確。

這是我的代碼:

public string GetData (string destinationFile)
{
    string conectionString = "uid=One_User;pwd=One_Password;database=One_Database;server=One_Server";

    SqlConnection con = new SqlConnection(conectionString);
    SqlCommand sqlCmd = new SqlCommand();

    string returnValue = string.Empty;
    string procedureName = "spGet_Data";

    sqlCmd.CommandType = CommandType.StoredProcedure;
    sqlCmd = new SqlCommand(procedureName, con);

    sqlCmd.Parameters.AddWithValue("@FileName", destinationFile);
    con.Open();
    var returnParameter = sqlCmd.Parameters.Add("@ret", SqlDbType.VarChar);
    returnParameter.Direction = ParameterDirection.ReturnValue;

    sqlCmd.ExecuteNonQuery();
    returnValue = returnParameter.Value.ToString();

    con.Close();
    return returnValue;
}

程序本身正確返回數據,我檢查連接是否處於Open狀態。

它還能做什么?

謝謝。

問題在於您創建命令兩次。
在第一次初始化之后,您將CommandType正確設置為StoredProcedure ,但是再一次創建了命令,這次您忘記設置CommandType

只需刪除第一個初始化,只留下第二個初始化並在初始化后移動CommandType設置

SqlConnection con = new SqlConnection(conectionString);
string returnValue = string.Empty;
string procedureName = "spGet_Data";
SqlCommand sqlCmd = new SqlCommand(procedureName, con);
sqlCmd.CommandType = CommandType.StoredProcedure;

哎呦。 這是在做,雖然不正確 看到另一個答案。


請參見SqlCommand.CommandType 你需要告訴它被視為一個sproc調用。 例如

sqlCmd.CommandType = CommandType.StoredProcedure;

否則會導致無效的SQL語句(即在SSMS查詢中逐字運行spGet_Data應產生類似的消息)。

您創建一個SqlCommand對象,然后設置它的CommandType屬性,然后再次通過在命令對象上調用new來覆蓋它。 寫得正確,您的代碼應如下所示:

public string GetData (string destinationFile)
{
   string conectionString = "uid=One_User;pwd=One_Password;database=One_Database;server=One_Server";
   SqlConnection con = new SqlConnection(connectionString);
   SqlCommand sqlCmd = new SqlCommand(procedureName, con); 
   sqlCmd.CommandType = CommandType.StoredProcedure;  
   string returnValue = string.Empty;
   string procedureName = "spGet_Data";

   sqlCmd.Parameters.AddWithValue("@FileName", destinationFile);
   con.Open();
   var returnParameter = sqlCmd.Parameters.Add("@ret", SqlDbType.VarChar);
   returnParameter.Direction = ParameterDirection.ReturnValue;

   sqlCmd.ExecuteNonQuery();
   returnValue = returnParameter.Value.ToString();

   con.Close();
   return returnValue;
}

另外,我強烈建議您使用Using語句包圍SqlConnectionSqlCommand對象。 很像這樣:

public string GetData (string destinationFile)
{
   using (SqlConnection con = new SqlConnection(connectionString))
   {
      using (SqlCommand sqlCmd = new SqlCommand(procedureName, con))
      {
      }
   } 
}    

以這種方式執行此操作的好處是更清晰的代碼,並且由於您的命令和連接對象實現了IDisposable ,因此一旦它們超出范圍,它們將由GC處理。

順便說一句,你有'conectionString'拼寫錯誤; 我在我的代碼示例中修復了它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM