列名或所提供值的数量与表定义不匹配(日期格式不正确?)
本文关键字:不匹配 定义 日期 格式 不正确 | 更新日期: 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中,Date
与DateTime
不是一回事。Date
只是一个数据,DateTime
有更多的数据来保存时间信息。在SQL中将其切换为DATETIME
。点击这里查看更多信息
您还需要防御SQL注入。使用参数化的SQL查询和命令执行此操作。