お世話になっております。 下記URLを参考にC#からストアドを実行して結果を返すコードを書きました。 https://code.msdn.microsoft.com/windowsdesktop/DataAccess-howto-32c91bf0 しかし以下のエラーになりました。 プロシージャまたは関数 'ap_TEST' にはパラメーター '@P1' が必要ですが、指定されませんでした。 下記コードです。 宜しくお願い致します。 ■ストアド SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER PROCEDURE [dbo].[ap_TEST] @P1 VARCHAR(10), @P2 VARCHAR(10) AS BEGIN DECLARE @CNT INT = 0 SELECT @CNT = count(*) FROM S_USER WHERE USERID = '@P1' and PASSWORD = '@P2' RETURN @CNT END ■C#コード public static int ExecuteStored(string cSqlConnection, string userid, string pass) { int returnValue = 0; using (SqlCommand command = new SqlCommand()) { SqlConnection conn = new SqlConnection(cSqlConnection); conn.ConnectionString = cSqlConnection; conn.Open(); SqlCommand cmd = new SqlCommand("ap_TEST", conn); SqlCommand hCommand = conn.CreateCommand(); try { command.CommandType = CommandType.StoredProcedure; //パラメータ1 cmd.Parameters.Add(new SqlParameter("P1", SqlDbType.Text)); cmd.Parameters["P1"].Direction = ParameterDirection.Input; cmd.Parameters["P1"].Value = userid; //パラメータ2 cmd.Parameters.Add(new SqlParameter("P2", SqlDbType.Text)); cmd.Parameters["P2"].Direction = ParameterDirection.Input; cmd.Parameters["P2"].Value = pass; //戻り値 cmd.Parameters.Add(new SqlParameter("ReturnValue", SqlDbType.Int)); cmd.Parameters["ReturnValue"].Direction = ParameterDirection.ReturnValue; SqlDataReader dr = cmd.ExecuteReader(); while (dr.Read()) { Console.WriteLine("結果セット:" + dr[0]); } dr.Close(); returnValue = ((int)cmd.Parameters["ReturnValue"].Value); } catch (System.Exception) { throw; } finally { conn.Close(); } return returnValue; } } −−−ここまで
しまさん 魔界の仮面弁士さん返信ありがとうございます。 いろいろコピペして無駄なコードになっていました。 また指摘を受けて以下のコードに修正しました。 ストアド側はそのままです。 SQL-Serverは2012devバージョンです。 結果としてヒットして1件返りました。 public static int ExecuteStored(string cSqlConnection, string userid, string pass) { int returnValue = 0; using (SqlConnection conn = new SqlConnection(cSqlConnection)) { try { conn.ConnectionString = cSqlConnection; conn.Open(); using (SqlCommand cmd = new SqlCommand("ap_TEST", conn)) { cmd.CommandType = CommandType.StoredProcedure; cmd.CreateParameter(); //パラメータ1 cmd.Parameters.Add(new SqlParameter("@P1", SqlDbType.VarChar)); cmd.Parameters["@P1"].Direction = ParameterDirection.Input; cmd.Parameters["@P1"].Value = userid; //パラメータ2 cmd.Parameters.Add(new SqlParameter("@P2", SqlDbType.VarChar)); cmd.Parameters["@P2"].Direction = ParameterDirection.Input; cmd.Parameters["@P2"].Value = pass; //戻り値 cmd.Parameters.Add(new SqlParameter("ReturnValue", SqlDbType.Int)); cmd.Parameters["ReturnValue"].Direction = ParameterDirection.ReturnValue; cmd.ExecuteReader(); returnValue = ((int)cmd.Parameters["ReturnValue"].Value); } } catch (System.Exception) { throw; } finally { conn.Close(); } return returnValue; } }
■No33030に返信(みさんの記事) >>データの特製に併せて、DbType プロパティとして 特製→特性 m(_ _)m > すみません。この部分ですがどのように実装するのでしょうか DbType は、SqlParameter のプロパティです。ですから、 cmd.Parameters.Add(new SqlParameter("@P0", SqlDbType.Char, 10) { DbType = DbType.AnsiStringFixedLength }); のように指定するか、もしくは Parameters.Add した後で cmd.Parameters["@P0"].DbType = DbType.AnsiStringFixedLength; のように指定すれば OK です。 >>また、CHAR/VARCHAR/NCHAR/NVARCHAR 指定時は、 たとえば CHAR(10) 型の列に "ABC" というデータを格納する場合、 実際には "ABC " のように 10 桁分の末尾空白が補完されます。 10桁というのが文字数なら、DbType.String/StringFixedLength 10桁というのがバイト数なら DbType.AnsiString/AnsiStringFixedLength です。 〜FixedLength の方は文字通りの固定長であり、通常は CHAR / NCHAR 型に対して、「Size プロパティ」と共に指定します。 というのも、データベースによっては、この末尾空白部分の扱いが異なり、 WHERE CharFieldName = 'ABC ' ではマッチしても、 WHERE CharFieldName = 'ABC' ではマッチしない場合があるからです。(逆に、同一視する環境もあります) CHAR 型や NCHAR で、この末尾空白が重要な意味を持つ場合、 Size プロパティと合わせて、DbType プロパティを明示し、そこに (Ansi)StringFixedLength を指定することになる、というわけです。 一方、(Ansi)String の方は可変長という事で、 通常は VARCHAR / NVARCHAR 型に対して用います。