3

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

还能是什么?

谢谢你。

4

3 回答 3

4

问题在于您创建了两次命令。
在第一次初始化之后,您正确设置了CommandTypeto 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;
于 2013-10-17T21:51:12.860 回答
1

哎呀。正在这样做,尽管不正确。看另一个答案。


请参阅SqlCommand.CommandType。您需要告诉它被视为存储过程调用。例如

sqlCmd.CommandType = CommandType.StoredProcedure;

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

于 2013-10-17T21:49:56.363 回答
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;
}

另外,我强烈建议您使用 Using StatementSqlConnection围绕您的和SqlCommand对象。很像这样:

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

这样做的好处是代码更简洁,并且由于您的命令和连接对象实现IDisposable,一旦超出范围,它们将由 GC 处理。

顺便说一句,您的“connectionString”拼写错误;我在我的代码示例中修复了它。

于 2013-10-17T22:21:41.213 回答