从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
状态。
它还能做什么?
谢谢。
答案 0 :(得分:4)
问题在于您创建了两次命令
在第一次初始化之后,您将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;
答案 1 :(得分:1)
糟糕。这已经完成,虽然不正确。见其他答案。
见SqlCommand.CommandType。你需要告诉它被视为一个sproc调用。 E.g。
sqlCmd.CommandType = CommandType.StoredProcedure;
否则会导致无效的SQL语句(即在SSMS查询中逐字运行spGet_Data
应产生类似的消息)。
答案 2 :(得分: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 Statement包围SqlConnection
和SqlCommand
个对象。很像这样:
public string GetData (string destinationFile)
{
using (SqlConnection con = new SqlConnection(connectionString))
{
using (SqlCommand sqlCmd = new SqlCommand(procedureName, con))
{
}
}
}
以这种方式执行此操作的好处是更清晰的代码,并且由于您的命令和连接对象实现了IDisposable
,因此一旦它们超出范围,它们将由GC处理。
顺便说一句,你有'conectionString'拼写错误;我在我的代码示例中修复了它。