Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 不正确的SQL语法错误ADO.NET_Sql Server_Ado.net - Fatal编程技术网

Sql server 不正确的SQL语法错误ADO.NET

Sql server 不正确的SQL语法错误ADO.NET,sql-server,ado.net,Sql Server,Ado.net,当我试着运行这个时,我得到一个SqlException,消息是“关键字'PROCEDURE'附近的语法不正确” 堆栈跟踪: at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean break

当我试着运行这个时,我得到一个SqlException,消息是“关键字'PROCEDURE'附近的语法不正确”

堆栈跟踪:

at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()
at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result, String methodName, Boolean sendToPipe)
at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
at xxx.Program.Main(String[] args) in C:\xxx\Program.cs:line 121
但是,我尝试在SQL查询中直接复制SQL命令并执行它,结果成功了。(它创建了程序)

为了给您提供一些上下文,这里有一个更大的代码部分

SqlParameter stateName = new SqlParameter();
stateName.SqlDbType = SqlDbType.NVarChar;
stateName.Direction = ParameterDirection.Input;
stateName.ParameterName = "@Name";
stateName.Size = 50;
Console.Write("Enter state name: ");
stateName.Value = Console.ReadLine();
cmd.Parameters.Add(stateName);

cmd.CommandText = @"IF EXISTS (SELECT name FROM sysobjects WHERE name='FindState' AND type='P') DROP PROCEDURE FindState";
cmd.ExecuteNonQuery();
cmd.CommandText = @"CREATE PROCEDURE FindState
@Name nvarchar(50)
AS
SELECT IDState FROM State WHERE Name=@Name";
cmd.ExecuteNonQuery();
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "FindState";
sdr = cmd.ExecuteReader();
if (sdr.HasRows)
{
  while (sdr.Read())
  {
    Console.WriteLine("ID state " + stateName.Value + " is " + sdr[0]);
  }
}
else
{
  Console.WriteLine("No such state exists");
}
sdr.Close();
试试这个:

SqlParameter stateName = new SqlParameter();
stateName.SqlDbType = SqlDbType.NVarChar;
stateName.Direction = ParameterDirection.Input;
stateName.ParameterName = "@Name";
stateName.Size = 50;
Console.Write("Enter state name: ");
stateName.Value = Console.ReadLine();
cmd.Parameters.Add(stateName);

cmd.CommandText = "IF EXISTS (SELECT name FROM sysobjects WHERE name='FindState' AND type='P') DROP PROCEDURE FindState";
cmd.ExecuteNonQuery();
cmd.CommandText = "CREATE PROCEDURE FindState
@Name nvarchar(50)
AS
BEGIN
SELECT IDState FROM State WHERE Name=@Name";
END

cmd.CommandType = CommandType.StoredProcedure;
cmd.ExecuteNonQuery();
cmd.CommandText = "FindState";

sdr = cmd.ExecuteReader();
if (sdr.HasRows)
{
  while (sdr.Read())
  {
    Console.WriteLine("ID state " + stateName.Value + " is " + sdr[0]);
  }
}
else
{
  Console.WriteLine("No such state exists");
}
sdr.Close();

我知道问题出在哪里了。 在创建过程之前,该参数已添加到SqlCommand。 我把这条线移了下来,现在它可以工作了

cmd.CommandText = @"CREATE PROCEDURE FindState @Name nvarchar(50) AS SELECT IDState FROM State WHERE Name=@Name";
cmd.ExecuteNonQuery();
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "FindState";
cmd.Parameters.Add(stateName);
sdr = cmd.ExecuteReader();

没有erorr消息(带有堆栈跟踪),没有行号和不清理参数的代码-投票关闭。这个创建过程FindState(@Name nvarchar(50))怎么样作为SELECT IDState FROM State WHERE Name=@Name,请注意存储过程参数前后的打开和关闭花括号,在参数周围放置花括号,但不起作用。这是我建议不要“回收”
SqlCommand
对象的原因之一-每个需要执行的作业使用一个(一个用于创建过程,另一个用于调用该过程)
cmd.CommandText = @"CREATE PROCEDURE FindState @Name nvarchar(50) AS SELECT IDState FROM State WHERE Name=@Name";
cmd.ExecuteNonQuery();
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "FindState";
cmd.Parameters.Add(stateName);
sdr = cmd.ExecuteReader();