2012-11-09 4 views
0

실행하려고하면 SqlException 메시지가 "잘못된 구문을 'PROCEDURE'키워드 근처에 가져옵니다."잘못된 SQL 구문 오류 ADO.NET

120: cmd.CommandText = @"CREATE PROCEDURE FindState @Name nvarchar(50) 
    AS SELECT IDState FROM State WHERE [email protected]"; 
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:\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 
BEGIN 
SELECT IDState FROM State WHERE [email protected]"; 
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(); 
+0

없음 erorr 메시지가 작동하지 않습니다. – TomTom

+0

에 대해이 절차 FindState (@Name의 NVARCHAR (50)) 이름 = @ 이름이 이전과 – CjCoax

+0

매개 변수 주위에 괄호를 넣어 시도 저장된 프로 시저 매개 변수 후에 열고 닫는 중괄호주의 국가로부터 SELECT IDState AS 를 작성하는 방법 그러나 그것은 작동하지 않았다. – HomeIsWhereThePcIs

답변

0

나는 문제가 무엇인지 파악 :

이 시도 여기에 몇 가지 문맥을주는 코드

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 [email protected]"; 
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(); 
+0

그 이유 중 하나는''SqlCommand' 개체를 "재활용"하지 않는 ** ** ** 당신이해야 할 작업 당 하나씩 사용하는 것입니다 (CREATE PROCEDURE와 그 프로 시저를 호출하기 위해 하나씩) –

0

조금 더 큰 섹션하기 위해 (이 절차를 생성). 매개 변수가 프로 시저를 만들기 전에 SqlCommand에 추가되었습니다. 투표를 닫 없습니다 - 매개 변수를 정리하지 않습니다에는 행 번호와 코드가 나는 아래 줄을 이동 지금은 (스택 추적과)

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