列名或所提供值的数量与表定义不匹配(日期格式不正确?)

本文关键字:不匹配 定义 日期 格式 不正确 | 更新日期: 2023-09-27 18:03:18

我在我的ASP中得到了以下错误消息。. Net应用程序(c#):

Column name or number of supplied values does not match table definition

表定义如下:

CREATE TABLE [dbo].[Invoices] (
[Id]             INT        NOT NULL,
[EMail]          NCHAR (30) NOT NULL,
[InvoiceNr]      INT        NOT NULL,
[Datum]          DATE       NOT NULL,
[AnzahlProdukte] INT        NOT NULL,
[Gesamtpreis]    MONEY      NOT NULL,
PRIMARY KEY CLUSTERED ([Id] ASC)
);

我在c#中的插入是这样的:

string command = String.Format("INSERT into Invoices values ({0}, '{1}', {2}, '{3}', {4}, {5});", currId, EmailAdressCustomer, currInvoices, today, quantityCart, price);

数据类型如下:

int currId = 0;
string EmailAdressCustomer = Session["CustomerEmail"].ToString();
int currInvoices = 0;
DateTime today = DateTime.Now;
int quantityCart = 0;
double fullprice = Convert.ToDouble(Session["FullPrice"].ToString());
        SqlMoney price = new SqlMoney();
        price = (SqlMoney) fullprice;
我希望任何人都能帮助我。谢谢很多!

列名或所提供值的数量与表定义不匹配(日期格式不正确?)

问题是该字符串的双精度值。使用区域十进制分隔符在字符串中进行格式转换。如果您的语言环境中小数分隔符是逗号,那么您将准备好迎接一个大惊喜。

例如,如果您有

double price = 12.4;
string s = string.Format("{0}", price);
Console.WriteLine(s);

在我的语言环境(意大利语)中,输出是

12,4

如您所见,通过字符串连接,这将成为表定义所不期望的新值

可以指向不同的string重载。格式如下

string.Format(CultureInfo.InvariantCulture, "{0}", price);

但这只是治标不治本的方法,而不是真正的问题。
建议对此问题的唯一解决方案是参数化查询

 string cmdText = "INSERT into Invoices values (@id, @email, @inv, @dt, @qta, @prix)";
 SqlCommand cmd = new SqlCommand(cmdText, connection);
 cmd.Parameters.AddWithValue("@id", currId);
 cmd.Parameters.AddWithValue("@email", emailAdressCustomer);
 cmd.Parameters.AddWithValue("@inv", currInvoices);
 cmd.Parameters.AddWithValue("@dt", today);
 cmd.Parameters.AddWithValue("@qta", quantityCart);
 cmd.Parameters.AddWithValue("@pix", price);
 connection.Open();
 cmd.ExecuteNonQuery();

通过这种方式,正确处理小数分隔符、字符串引号、日期格式(不要忘记整个Sql注入漏洞)被传递给可能更知道如何做的框架代码。

在MS SQL中,DateDateTime不是一回事。Date只是一个数据,DateTime有更多的数据来保存时间信息。在SQL中将其切换为DATETIME。点击这里查看更多信息

编辑:

您还需要防御SQL注入。使用参数化的SQL查询和命令执行此操作。