0

テーブルに複合キー(col1、col2)が
あります。col1で「主キーにnull値を挿入できません」というエラーが表示されますが、実際にはnull値を挿入しようとはしていません。デバッグモードで確認しましたが、値は
アイデアを 無効にしますか?

これは私のストアドプロシージャです:

CREATE PROCEDURE [dbo].[proc1]
@col1 char(11) = NULL,
@col2 nchar(50) = NULL,
@col3 real = NULL
AS
BEGIN
SET NOCOUNT ON;

-- Insert statements for procedure here
update dbo.table1 set col2 = @col2 where col1 = @col1 AND col3 = @col3
if @@ROWCOUNT=0
insert into dbo.table1 ( col1, col2, col3 ) values ( @col1, @col2, @col3 )



これは私のコードです:

SqlConnection conn = create_conn();
conn.Open();
SqlCommand command = new SqlCommand("another_proc", conn);
command.Parameters.Add("col1", SqlDbType.Char).Value = col1;
SqlDataAdapter da = new SqlDataAdapter(command);
DataSet ds = new DataSet();
da.Fill(ds);

command = new SqlCommand("proc1", conn);

// here i set the value of the parameter
**command.Parameters.Add("col1", SqlDbType.Char).Value = col1;**

command.Parameters.Add("col2", SqlDbType.NChar);
command.Parameters.Add("col3", SqlDbType.Real);
double y, yk, ym, yy;
int k, m;
string col2;
foreach (DataRow dr in ds.Tables[0].Rows)
{
    col2 = dr["col2"].ToString().Trim();
    yk = Double.Parse(dr["yk"].ToString());
    ym = Double.Parse(dr["ym"].ToString());
    yy = Double.Parse(dr["yy"].ToString());
    k = Int32.Parse(dr["k"].ToString());
    m = Int32.Parse(dr["m"].ToString());
    y = Double.Parse(dr["y"].ToString());
    double col3 = ...some calculation here...;
    command.Parameters["col2"].Value = col2;
    command.Parameters["col3"].Value = col3;
    command.ExecuteNonQuery();
}
conn.Close();



更新されたコード:

SqlConnection conn = create_conn();
conn.Open();
SqlCommand command = new SqlCommand("another_proc", conn);
command.Parameters.Add("col1", SqlDbType.Char).Value = col1;
SqlDataAdapter da = new SqlDataAdapter(command);
DataSet ds = new DataSet();
da.Fill(ds);

command.CommandText = "proc1";
command.Parameters.Add("col2", SqlDbType.NChar);
command.Parameters.Add("col3", SqlDbType.Real);
double y, yk, ym, yy;
int k, m;
string col2;
foreach (DataRow dr in ds.Tables[0].Rows)
{
    col2 = dr["col2"].ToString().Trim();
    yk = Double.Parse(dr["yk"].ToString());
    ym = Double.Parse(dr["ym"].ToString());
    yy = Double.Parse(dr["yy"].ToString());
    k = Int32.Parse(dr["k"].ToString());
    m = Int32.Parse(dr["m"].ToString());
    y = Double.Parse(dr["y"].ToString());
    double col3 = k * (yk / 100) + m * (ym / 100) + y * (yy / 100);
    command.Parameters["col2"].Value = col2;
    command.Parameters["col3"].Value = col3;
    command.ExecuteNonQuery();
}
conn.Close();
4

2 に答える 2

2

どうして私たちは皆それを逃したのですか?

command.CommandType = CommandType.StoredProcedure;
于 2012-06-21T19:45:42.943 に答える
2

Col1とcol2は複合キーを作成しているため、null許容にしないでください。変化する

@col1 char(11) = NULL,
@col2 nchar(50) = NULL,

@col1 char(11) ,
@col2 nchar(50),

また、すべてのパラメーターのパラメーター追加をsqlprocedureに変更します

command.Parameters.Add("col1", SqlDbType.Char).Value = col1;

command.Parameters.Add("@col1", SqlDbType.Char).Value = col1;

また

 command.Parameters.Add("@col1", SqlDbType.Char);
 command.Parameters["@col1"].Value = col1;

編集

エラー「プロシージャまたは関数'proc1'は、指定されていないパラメータ'@col1'を予期しています。」誤解を招く恐れがありました。問題は、CommandTypeが設定されていないことが原因でした。コマンドを実行する前に、新しいコマンドを作成し、以下のステートメントを追加してください。

SqlCommand command = new SqlCommand("proc1", conn);
command1.CommandType = CommandType.StoredProcedure;

また、ループ内のパラメーターコレクションをクリアします。

for (int i = 0; i < 10; i++)
{
   col1 = "Col1 value " + i;
   col2 = "Col2 value " + i;
   col3 = "Col3 value" + i;

   command.Parameters.Clear();

   command.Parameters.Add("@col1", SqlDbType.VarChar).Value = col1;
   command.Parameters.Add("@col2", SqlDbType.VarChar).Value = col2;
   command.Parameters.Add("@col3", SqlDbType.VarChar).Value = col3;

   command1.ExecuteNonQuery();
} 
于 2012-06-21T10:19:51.700 に答える