2013-10-17 69 views
3

调用存储过程时,从C#调用SQL Server中的存储过程时,我收到以下错误的错误:充分利用C#

行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状态。

它还能是什么?

谢谢。

+2

为什么你'新''你的'sqlCmd'对象两次? – Brian

回答

1

后,您创建一个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; 
} 

另外,我会强烈建议您环绕你SqlConnectionSqlCommand对象与Using Statement。就像这样:

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

做这种方式是更干净的代码,并因为你的命令和连接对象实现IDisposable,他们将通过GC一旦他们掉下来的范围处理的好处。

顺便说一句,你有'conectionString'拼写错误;我在我的代码示例中修复了它。

1

哎呦。这是正在完成,尽管不正确。见另一个答案。


参见SqlCommand.CommandType。你需要告诉它被视为一个sproc调用。例如。

sqlCmd.CommandType = CommandType.StoredProcedure; 

否则会产生无效的SQL语句(即运行spGet_Data在SSMS查询应产生类似的消息逐字)。

4

问题在于您创建了两次命令。
第一初始化后您正确设置CommandTypeStoredProcedure,但再次创建的命令,这时候你忘了将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;