无法在带有参数的sql表中写入

时间:2013-04-18 08:58:15

标签: c# sql sql-server

我想使用以下代码在sql表中写入数据然后我收到错误。

当我查看我的Visual Studio时,我可以看到@ p1等中有数据......

SqlCommand send = new SqlCommand("INSERT INTO test(code,type,datum,uur,controller,fout,teller,omschrijving,graad,var1,var2,var3,var4,var5,var6,var7,var8,var9,var10,var11,var12,var13,var14,var15,var16,var17,var18,var19,var20,var21,var22,var23,var24,var25,var26,var27,var28,var29,var30,var31,var32,var33,var34,var35,var36,var37,var38,var39,var40)" + "values (@p1,@p2,@p3,@p4,@p5,@p6,@p7,@p8,@p9,@p10,@p11,@p12,@p13,@p14,@p15,@p16,@p17,@p18,@p19,@p20,@p21,@p22,@p23,@p24,@p25,@p26,@p27,@p28,@p29,@p30,@p31,@p32,@p33,@p34,@p35,@p36,@p37,@p38,@p39,@p40,@p41,@p42,@p43,@p44,@p45,@p46,@p47,@p48,@p49)", connection);
       while (foutinformatie[0, lusteller] != null)          //zolang uitvoeren als er data is
        {

            //rij per rij in tabel plaatsensd
            key = foutinformatie[0, lusteller] + "/" + foutinformatie[1, lusteller] + "/" + foutinformatie[2, lusteller] + "/" + foutinformatie[3, lusteller] + "/" + foutinformatie[4, lusteller];
            send.Parameters.Clear();
            SqlParameter myParam1 = new SqlParameter("@p1", SqlDbType.Text);
            myParam1.Value = key;
            SqlParameter myParam2 = new SqlParameter("@p2", SqlDbType.Text);
            myParam2.Value = foutinformatie[0, lusteller];
            SqlParameter myParam3 = new SqlParameter("@p3", SqlDbType.Text);
            myParam3.Value = foutinformatie[1, lusteller];
            SqlParameter myParam4 = new SqlParameter("@p4", SqlDbType.Text);
            myParam4.Value = foutinformatie[2, lusteller];
            SqlParameter myParam5 = new SqlParameter("@p5", SqlDbType.Text);
            myParam5.Value = foutinformatie[3, lusteller];
            SqlParameter myParam6 = new SqlParameter("@p6", SqlDbType.Text);
            myParam6.Value = foutinformatie[4, lusteller];
            SqlParameter myParam7 = new SqlParameter("@p7", SqlDbType.Text);
            myParam7.Value = foutinformatie[5, lusteller];
            SqlParameter myParam8 = new SqlParameter("@p8", SqlDbType.Text);
            myParam8.Value = foutinformatie[6, lusteller];
            SqlParameter myParam9 = new SqlParameter("@p9", SqlDbType.Text);
            myParam9.Value = foutinformatie[7, lusteller];
            SqlParameter myParam10 = new SqlParameter("@p10", SqlDbType.Text);
            myParam10.Value = foutinformatie[8, lusteller];
            SqlParameter myParam11 = new SqlParameter("@p11", SqlDbType.Text);
            myParam11.Value = foutinformatie[9, lusteller];
            SqlParameter myParam12 = new SqlParameter("@p12", SqlDbType.Text);
            myParam12.Value = foutinformatie[10, lusteller];
            SqlParameter myParam13 = new SqlParameter("@p13", SqlDbType.Text);
            myParam13.Value = foutinformatie[11, lusteller];
            SqlParameter myParam14 = new SqlParameter("@p14", SqlDbType.Text);
            myParam14.Value = foutinformatie[12, lusteller];
            SqlParameter myParam15 = new SqlParameter("@p15", SqlDbType.Text);
            myParam15.Value = foutinformatie[13, lusteller];
            SqlParameter myParam16 = new SqlParameter("@p16", SqlDbType.Text);
            myParam16.Value = foutinformatie[14, lusteller];
            SqlParameter myParam17 = new SqlParameter("@p17", SqlDbType.Text);
            myParam17.Value = foutinformatie[15, lusteller];
            SqlParameter myParam18 = new SqlParameter("@p18", SqlDbType.Text);
            myParam18.Value = foutinformatie[16, lusteller];
            SqlParameter myParam19 = new SqlParameter("@p19", SqlDbType.Text);
            myParam19.Value = foutinformatie[17, lusteller];
            SqlParameter myParam20 = new SqlParameter("@p20", SqlDbType.Text);
            myParam20.Value = foutinformatie[18, lusteller];
            SqlParameter myParam21 = new SqlParameter("@p21", SqlDbType.Text);
            myParam21.Value = foutinformatie[19, lusteller];
            SqlParameter myParam22 = new SqlParameter("@p22", SqlDbType.Text);
            myParam22.Value = foutinformatie[20, lusteller];
            SqlParameter myParam23 = new SqlParameter("@p23", SqlDbType.Text);
            myParam23.Value = foutinformatie[21, lusteller];
            SqlParameter myParam24 = new SqlParameter("@p24", SqlDbType.Text);
            myParam24.Value = foutinformatie[22, lusteller];
            SqlParameter myParam25 = new SqlParameter("@p25", SqlDbType.Text);
            myParam25.Value = foutinformatie[23, lusteller];
            SqlParameter myParam26 = new SqlParameter("@p26", SqlDbType.Text);
            myParam26.Value = foutinformatie[24, lusteller];
            SqlParameter myParam27 = new SqlParameter("@p27", SqlDbType.Text);
            myParam27.Value = foutinformatie[25, lusteller];
            SqlParameter myParam28 = new SqlParameter("@p28", SqlDbType.Text);
            myParam28.Value = foutinformatie[26, lusteller];
            SqlParameter myParam29 = new SqlParameter("@p29", SqlDbType.Text);
            myParam29.Value = foutinformatie[27, lusteller];
            SqlParameter myParam30 = new SqlParameter("@p30", SqlDbType.Text);
            myParam30.Value = foutinformatie[28, lusteller];
            SqlParameter myParam31 = new SqlParameter("@p31", SqlDbType.Text);
            myParam31.Value = foutinformatie[29, lusteller];
            SqlParameter myParam32 = new SqlParameter("@p32", SqlDbType.Text);
            myParam32.Value = foutinformatie[30, lusteller];
            SqlParameter myParam33 = new SqlParameter("@p33", SqlDbType.Text);
            myParam33.Value = foutinformatie[31, lusteller];
            SqlParameter myParam34 = new SqlParameter("@p34", SqlDbType.Text);
            myParam34.Value = foutinformatie[32, lusteller];
            SqlParameter myParam35 = new SqlParameter("@p35", SqlDbType.Text);
            myParam35.Value = foutinformatie[33, lusteller];
            SqlParameter myParam36 = new SqlParameter("@p36", SqlDbType.Text);
            myParam36.Value = foutinformatie[34, lusteller];
            SqlParameter myParam37 = new SqlParameter("@p37", SqlDbType.Text);
            myParam37.Value = foutinformatie[35, lusteller];
            SqlParameter myParam38 = new SqlParameter("@p38", SqlDbType.Text);
            myParam38.Value = foutinformatie[36, lusteller];
            SqlParameter myParam39 = new SqlParameter("@p39", SqlDbType.Text);
            myParam39.Value = foutinformatie[37, lusteller];
            SqlParameter myParam40 = new SqlParameter("@p40", SqlDbType.Text);
            myParam40.Value = foutinformatie[38, lusteller];
            SqlParameter myParam41 = new SqlParameter("@p41", SqlDbType.Text);
            myParam41.Value = foutinformatie[39, lusteller];
            SqlParameter myParam42 = new SqlParameter("@p42", SqlDbType.Text);
            myParam42.Value = foutinformatie[40, lusteller];
            SqlParameter myParam43 = new SqlParameter("@p43", SqlDbType.Text);
            myParam43.Value = foutinformatie[41, lusteller];
            SqlParameter myParam44 = new SqlParameter("@p44", SqlDbType.Text);
            myParam44.Value = foutinformatie[42, lusteller];
            SqlParameter myParam45 = new SqlParameter("@p45", SqlDbType.Text);
            myParam45.Value = foutinformatie[43, lusteller];
            SqlParameter myParam46 = new SqlParameter("@p46", SqlDbType.Text);
            myParam46.Value = foutinformatie[44, lusteller];
            SqlParameter myParam47 = new SqlParameter("@p47", SqlDbType.Text);
            myParam47.Value = foutinformatie[45, lusteller];
            SqlParameter myParam48 = new SqlParameter("@p48", SqlDbType.Text);
            myParam48.Value = foutinformatie[46, lusteller];
            SqlParameter myParam49 = new SqlParameter("@p49", SqlDbType.Text);
            myParam49.Value = foutinformatie[47, lusteller];

            send.Parameters.Add(myParam1);
            send.Parameters.Add(myParam2);
            send.Parameters.Add(myParam3);
            send.Parameters.Add(myParam4);
            send.Parameters.Add(myParam5);
            send.Parameters.Add(myParam6);
            send.Parameters.Add(myParam7);
            send.Parameters.Add(myParam8);
            send.Parameters.Add(myParam9);
            send.Parameters.Add(myParam10);
            send.Parameters.Add(myParam11);
            send.Parameters.Add(myParam12);
            send.Parameters.Add(myParam13);
            send.Parameters.Add(myParam14);
            send.Parameters.Add(myParam15);
            send.Parameters.Add(myParam16);
            send.Parameters.Add(myParam17);
            send.Parameters.Add(myParam18);
            send.Parameters.Add(myParam19);
            send.Parameters.Add(myParam20);
            send.Parameters.Add(myParam21);
            send.Parameters.Add(myParam22);
            send.Parameters.Add(myParam23);
            send.Parameters.Add(myParam24);
            send.Parameters.Add(myParam25);
            send.Parameters.Add(myParam26);
            send.Parameters.Add(myParam27);
            send.Parameters.Add(myParam28);
            send.Parameters.Add(myParam29);
            send.Parameters.Add(myParam30);
            send.Parameters.Add(myParam31);
            send.Parameters.Add(myParam32);
            send.Parameters.Add(myParam33);
            send.Parameters.Add(myParam34);
            send.Parameters.Add(myParam35);
            send.Parameters.Add(myParam36);
            send.Parameters.Add(myParam37);
            send.Parameters.Add(myParam38);
            send.Parameters.Add(myParam39);
            send.Parameters.Add(myParam40);
            send.Parameters.Add(myParam41);
            send.Parameters.Add(myParam42);
            send.Parameters.Add(myParam43);
            send.Parameters.Add(myParam44);
            send.Parameters.Add(myParam45);
            send.Parameters.Add(myParam46);
            send.Parameters.Add(myParam47);
            send.Parameters.Add(myParam48);
            send.Parameters.Add(myParam49);
            try
            {
                int pos = Array.IndexOf(keys, key);
                if (pos == -1)
                {
                    connection.Open();
                    send.ExecuteNonQuery();
                 connection.Close();
                }
                else
                {

                }


            }
            catch
            {
                connection.Close();
               // MessageBox.Show("Can not open connection ! ");
            }

            lusteller = lusteller + 1;
        }
    }

错误:

  

参数化查询'(@ p1 text,@ p2 text,@ p3 text,@ p4 text,@ p5 text,@ p6 text,@ p7 text,'需要参数'@ p9',这是未提供的。

1 个答案:

答案 0 :(得分:0)

您的数据库中是否有可为空的列?这可能是问题所在。如果值为null,则必须显式传递DBNull.Value。如果不这样做,则可能无法正确识别参数并报告为缺失。您可以执行以下任务:

myParamX.Value = foutinformatie[0, lusteller] ?? DBNull.Value;

我还强烈建议您以更有效的方式创建参数。首先,在执行命令之前为命令ONCE创建所有参数并调用send.Prepare()。 比在循环中设置每行的值并执行命令。这样效率更高。

connection.Open();

SqlCommand send = new SqlCommand(
    "INSERT INTO test(code,type,datum,uur,controller,fout,teller,omschrijving,graad,var1,var2,var3,var4,var5,var6,var7,var8,var9,var10,var11,var12,var13,var14,var15,var16,var17,var18,var19,var20,var21,var22,var23,var24,var25,var26,var27,var28,var29,var30,var31,var32,var33,var34,var35,var36,var37,var38,var39,var40)" + 
    "values (@p1,@p2,@p3,@p4,@p5,@p6,@p7,@p8,@p9,@p10,@p11,@p12,@p13,@p14,@p15,@p16,@p17,@p18,@p19,@p20,@p21,@p22,@p23,@p24,@p25,@p26,@p27,@p28,@p29,@p30,@p31,@p32,@p33,@p34,@p35,@p36,@p37,@p38,@p39,@p40,@p41,@p42,@p43,@p44,@p45,@p46,@p47,@p48,@p49)", 
    connection);

for (int i = 1; i <= 49; i++)
{
    send.Parameters.Add("@p" + i, SqlDbType.Text);
}

// prepare command (see documentation)
send.Prepare();

//zolang uitvoeren als er data is
while (foutinformatie[0, lusteller] != null)          
{
    //rij per rij in tabel plaatsensd
    key = foutinformatie[0, lusteller] + "/" +
        foutinformatie[1, lusteller] + "/" +
        foutinformatie[2, lusteller] + "/" +
        foutinformatie[3, lusteller] + "/" + 
        foutinformatie[4, lusteller];

    send.Parameters[0].Value = key;

    // assign values in a loop with regarding DBNull
    for (int i = 1; i < 49; i++)
    {
        send.Parameters[i].Value = foutinformatie[i-1, lusteller] ?? DBNull.Value;
    }

    send.ExecuteNonQuery();

    lusteller = lusteller + 1;
}

我没有运行此代码,可能还有一些索引偏移问题。它应该只展示如何解决这个更优雅。