我收到以下错误:
System.FormatException:输入字符串的格式不正确。
System.Exception:未知错误:INSERT语句中的列少于VALUES子句中指定的值。 VALUES子句中的值数必须与INSERT语句中指定的列数相匹配。
INSERT语句的内容很容易看出:
INSERT INTO [dbo].[Out] ([Tag],[Element],[PeriodID],[Pay],[Output Value],[User],[Source],[Date],[ElementID]) values (1014758,'System-Rate Total',153640061,'No',21,67,'z8310905','CalcEngine',getdate(),6859)
问题在于< 21,67>应该是< 21.67>
上面的INSERT语句在C#中创建,如下所示:
commandText.AppendLine(string.Format("INSERT INTO [dbo].[Out] ([Tag],[Element],[PeriodID],[Pay],[Output Value],[User],[Source],[Date],[ElementID]) values ({0},'{1}',{2},'No',{3},'{4}','CalcEngine',getdate(),{5})", Tag, tx.ElementName, periodID, tx.Value, user, tx.ElementID));
所以tx.Value包含逗号而不是句点(句号)。
但是,这在我的笔记本电脑上运行正常,但在我们尝试安装解决方案的服务器上运行不正常。我的笔记本电脑有Windows 7,服务器有Windows 8.该解决方案使用.Net Framework 4,VS 2010用于创建它。
我试图在控制面板中设置服务器文化,语言等,与我的笔记本电脑完全相似。 我甚至在代码中添加了以下内容,以尝试阻止类似的事情发生在后续安装中(对于背景外观here):
// Creating a Global culture specific to our application.
System.Globalization.CultureInfo cultureInfo = new System.Globalization.CultureInfo("en-ZA");
// Creating the DateTime Information specific to our application.
System.Globalization.DateTimeFormatInfo dateTimeInfo = new System.Globalization.DateTimeFormatInfo();
// Defining various date and time formats.
dateTimeInfo.LongDatePattern = "dd MMMM yyyy";
dateTimeInfo.ShortDatePattern = "dd-MMM-yyyy";
dateTimeInfo.LongTimePattern = "HH:mm:ss";
dateTimeInfo.ShortTimePattern = "HH:mm";
// Setting application wide date time format.
cultureInfo.DateTimeFormat = dateTimeInfo;
//Creating the Number Format Information specific to our application.
System.Globalization.NumberFormatInfo numberInfo = new System.Globalization.NumberFormatInfo();
numberInfo.NumberDecimalSeparator = ".";
// Setting application wide number format.
cultureInfo.NumberFormat = numberInfo;
// Assigning our custom Culture to the application.
CultureChanges.SetDefaultCulture(cultureInfo);
这是在Windows服务的Main方法中输入的,它启动另一个最终执行上述INSERT语句的进程。 (不确定我是否还需要将它添加到衍生过程中?)
无论如何,我不知道该做什么或去哪里寻找这个错误。我想它必须与文化或服务器的不同设置有关。这个21.67的值可能是四舍五入的。
答案 0 :(得分:0)
而不是传递文本框值声明变量double或float并将该文本框值赋值给变量并传递该变量以插入查询
double Pay;
Pay=Double.Parse(tx.value)
将此付款传递给插入查询
答案 1 :(得分:0)
问题在于我正在以编程方式设置的文化(如原始帖子中的代码块所示)没有进入单个线程。因此,当我将代码插入到线程启动的位置时,每个线程都会获取正确的文化。