不正确的SQL语法错误ado.net



当我尝试运行此操作时,我会得到一个sqlexception,并带有"近距离'procement'processure'的消息"不正确的语法"。

120: cmd.CommandText = @"CREATE PROCEDURE FindState @Name nvarchar(50)
     AS SELECT IDState FROM State WHERE Name=@Name";
121: cmd.ExecuteNonQuery();

堆栈跟踪:

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:xxxProgram.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();

最新更新