[英]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語句包圍SqlConnection
和SqlCommand
對象。 很像這樣:
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.