SQL INSERT 失败,我找不到问题所在

SQL INSERT failed, I can't find the issue

我正在尝试将一些东西插入 SQL 服务器(使用 c#),当我尝试插入时它说它需要(在查询中)给定的参数并且它找不到它已声明。

"Additional information: The parameterized query '(@art varchar(8000),@oms varchar(8000),@rem varchar(8000),@artdk' expects the parameter '@art', which was not supplied."

我检查了参数数量、数据库连接,并尝试使用另一个插入命令作为参考,但我无法让它工作。而且我在互联网上找不到同样的问题。如果有人能帮助我,我将不胜感激。

更新: 我将 artnr.selectedvalue 更改为 artnr.text 这让我取得了一些进步,但现在我收到此错误

更新 2: 似乎如果我填充它尝试插入的每个框,它就可以工作..但它确实允许所有数据库单元格中的空值所以问题已被发现。只是要弄清楚哪个不能为空。

An unhandled exception of type 'System.Data.SqlClient.SqlException' occurred in System.Data.dll

Additional information: Error converting data type varchar to numeric.

当我输入所有数字或所有文本时出现此错误

SqlCommand slinkoopadd = new SqlCommand(@"insert into ART (ART ,OMS ,REM ,ARTDK ,TYPE ,MAG ,PROGRAM ,EH1 ,LEV ,LTD ,INK ,KOR ,SGR ,EH2 ,EF ,VALUTA ,CRNI )
                                                   values (@art,@oms,@rem,@artdk,@type,@mag,@program,@eh1,@lev,@ltd,@ink,@kor,@sgr,@eh2,@ef,@valuta,@crni);", Connectie.connMEVO_ART);
        #region parameters
        slinkoopadd.Parameters.Add("@art", SqlDbType.VarChar).Value = this.artnr.SelectedValue;
        slinkoopadd.Parameters.Add("@oms", SqlDbType.VarChar).Value = this.tekstinkoopoms.Text;
        slinkoopadd.Parameters.Add("@rem", SqlDbType.VarChar).Value = this.tekstinkoopopmerk.Text;
        slinkoopadd.Parameters.Add("@artdk", SqlDbType.VarChar).Value = this.tekstinkoopnummerlev.Text;
        slinkoopadd.Parameters.Add("@type", SqlDbType.VarChar).Value = this.tekstinkooparttype.Text;
        slinkoopadd.Parameters.Add("@mag", SqlDbType.VarChar).Value = this.tekstinkoopmagazijnloc.Text;
        slinkoopadd.Parameters.Add("@program", SqlDbType.VarChar).Value = this.tekstinkoopinternopmerk.Text;
        slinkoopadd.Parameters.Add("@eh1", SqlDbType.VarChar).Value = this.tekstinkoopeenheid.Text;
        slinkoopadd.Parameters.Add("@lev", SqlDbType.VarChar).Value = this.tekstinkoopstandleveran.Text;
        slinkoopadd.Parameters.Add("@ltd", SqlDbType.VarChar).Value = this.tekstinkooplevertijd.Text;
        slinkoopadd.Parameters.Add("@ink", SqlDbType.VarChar).Value = this.tekstinkoopbrutoprijs.Text;
        slinkoopadd.Parameters.Add("@kor", SqlDbType.VarChar).Value = this.tekstinkoopkorting.Text;
        slinkoopadd.Parameters.Add("@sgr", SqlDbType.VarChar).Value = this.tekstinkoopserievoorraad.Text;
        slinkoopadd.Parameters.Add("@eh2", SqlDbType.VarChar).Value = this.tekstinkoopgebruikeh.Text;
        slinkoopadd.Parameters.Add("@ef", SqlDbType.VarChar).Value = this.textinkoopehfactor.Text;
        //slinkoopadd.Parameters.Add("@", SqlDbType.VarChar).Value = this.artnr.Text;//perc. voor vracht
        slinkoopadd.Parameters.Add("@valuta", SqlDbType.VarChar).Value = this.tekstinkoopvaluta.Text;
        slinkoopadd.Parameters.Add("@crni", SqlDbType.VarChar).Value = this.tekstinkoopcrni.Text;
        //slinkoopadd.Parameters.Add("@", SqlDbType.VarChar).Value = this.artnr.Text;//extra kosten
        //slinkoopadd.Parameters.Add("@", SqlDbType.VarChar).Value = this.artnr.Text;//bestelgrootte afroep
        //slinkoopadd.Parameters.Add("@", SqlDbType.VarChar).Value = this.artnr.Text;//prognose jaarverbruik
        //slinkoopadd.Parameters.Add("@", SqlDbType.VarChar).Value = this.artnr.Text;//levertijd nieuwe afr
        #endregion
        drART = slinkoopadd.ExecuteReader();
        MessageBox.Show("Opgeslagen!");
        fillbox();
        while (drART.Read())
        { }
        slinkoopadd.Dispose();

这样试试?

slinkoopadd.Parameters.Add("@art", SqlDbType.VarChar);
slinkoopadd.Parameters["@art"].Value = this.artnr.SelectedValue;

我不确定你是否可以像那样通过管道传递呼叫。

drART = slinkoopadd.ExecuteReader();

您不希望阅读 某些东西。你要插入,那不是查询:

var result = slinkoopadd.ExecuteNonQuery();

我更改了查询中的一些小东西,并且我确保一些文本框在没有任何内容的情况下获得默认值,所以现在它可以工作了。这是当前有效的查询。

if (tekstinkoopcrni.Text == "1") { } else if (tekstinkoopcrni.Text == "0") { } 
else { tekstinkoopcrni.Text = "0"; }
if (tekstinkoopkorting.Text == "") { tekstinkoopkorting.Text = "0"; }
if (tekstinkoopserievoorraad.Text == "") { tekstinkoopserievoorraad.Text = "0"; }
if (tekstinkoopstandleveran.Text == "") { tekstinkoopstandleveran.Text = "9999"; }
if (tekstinkooplevertijd.Text == "") { tekstinkooplevertijd.Text = "0"; }

SqlCommand slinkoopadd = new SqlCommand(@"insert into ART (ART ,OMS ,REM ,ARTDK ,TYPE ,
MAG ,PROGRAM ,EH1 ,INK ,KOR ,SGR ,EH2 ,EF ,VALUTA ,CRNI  ,LEV ,LTD )
values (@art,@oms,@rem,@artdk,@type,@mag,@program,@eh1,@ink,@kor,@sgr,@eh2,@ef,
@valuta,@crni, @lev,@ltd);", Connectie.connMEVO_ART);                                   

#region parameters
slinkoopadd.Parameters.Add("@art", SqlDbType.VarChar).Value = this.artnr.Text;
slinkoopadd.Parameters.Add("@oms", SqlDbType.VarChar).Value = this.tekstinkoopoms.Text;
slinkoopadd.Parameters.Add("@rem", SqlDbType.VarChar).Value = this.tekstinkoopopmerk.Text;
slinkoopadd.Parameters.Add("@artdk", SqlDbType.VarChar).Value = this.tekstinkoopnummerlev.Text;
slinkoopadd.Parameters.Add("@type", SqlDbType.VarChar).Value = this.tekstinkooparttype.Text;
slinkoopadd.Parameters.Add("@mag", SqlDbType.VarChar).Value = this.tekstinkoopmagazijnloc.Text;
slinkoopadd.Parameters.Add("@program", SqlDbType.VarChar).Value = this.tekstinkoopinternopmerk.Text;
slinkoopadd.Parameters.Add("@eh1", SqlDbType.VarChar).Value = this.tekstinkoopeenheid.Text;
slinkoopadd.Parameters.Add("@lev", SqlDbType.VarChar).Value = this.tekstinkoopstandleveran.Text;
slinkoopadd.Parameters.Add("@ltd", SqlDbType.VarChar).Value = this.tekstinkooplevertijd.Text;
slinkoopadd.Parameters.Add("@ink", SqlDbType.VarChar).Value = this.tekstinkoopbrutoprijs.Text;
slinkoopadd.Parameters.Add("@kor", SqlDbType.VarChar).Value = this.tekstinkoopkorting.Text;
slinkoopadd.Parameters.Add("@sgr", SqlDbType.VarChar).Value = this.tekstinkoopserievoorraad.Text;
slinkoopadd.Parameters.Add("@eh2", SqlDbType.VarChar).Value = this.tekstinkoopgebruikeh.Text;
slinkoopadd.Parameters.Add("@ef", SqlDbType.VarChar).Value = this.textinkoopehfactor.Text;
slinkoopadd.Parameters.Add("@valuta", SqlDbType.VarChar).Value = this.tekstinkoopvaluta.Text;
slinkoopadd.Parameters.Add("@crni", SqlDbType.VarChar).Value = this.tekstinkoopcrni.Text;
#endregion
drART = slinkoopadd.ExecuteReader();
MessageBox.Show("Artikel opgeslagen!");
fillbox();
while (drART.Read())
{ }
slinkoopadd.Dispose();