C# 一个程序在我的电脑上运行良好,但当我在另一台装有荷兰Windows的电脑上发送时,它的日期时间选择器出现了问题

C# 一个程序在我的电脑上运行良好,但当我在另一台装有荷兰Windows的电脑上发送时,它的日期时间选择器出现了问题,c#,sql-server,C#,Sql Server,该程序使用C#WinForms和SQL Server 2008。当我想输入包含DateTimePicker中的值的数据时,我可以看到该措辞是荷兰语,然后我得到一个关于值转换的错误。有没有办法对其进行预编程以绕过此问题?我发现了错误,就在这里 try { SqlConnection connect = new SqlConnection("Data Source=Localhost\\SQLExpress;Initial Catalog=Da

该程序使用C#WinForms和SQL Server 2008。当我想输入包含DateTimePicker中的值的数据时,我可以看到该措辞是荷兰语,然后我得到一个关于值转换的错误。有没有办法对其进行预编程以绕过此问题?我发现了错误,就在这里

        try
        {
            SqlConnection connect = new SqlConnection("Data Source=Localhost\\SQLExpress;Initial Catalog=DataBase;Integrated Security=True");
            SqlDataAdapter da = new SqlDataAdapter();

            /******************** Inserting ********************/
            string query = "INSERT INTO spending VALUES (";
            query += "'" + date_dateTimePicker.Value + "', "; // Date
            query += "'" + Convert.ToDecimal(amount_spent_textBox.Text) + "', "; // Amount spent
            query += "'" + spent_on_textBox.Text + "')"; // Spent on
            connect.Open();
            da.InsertCommand = new SqlCommand(query, connect);
            da.InsertCommand.ExecuteNonQuery();

            connect.Close();
        }

        catch (Exception error)
        {
            MessageBox.Show(error.ToString());
        }

事情越来越复杂了。。我在尝试向数据库中插入dateTimePicker值时遇到了这个错误,方法与上面代码相同。它在我的电脑上运行得很好,但在这里不起作用。有人能解释一下吗?以下是错误:

使用的代码:

string update = "UPDATE table SET the_date = '" + the_date_dateTimePicker.Value + "' WHERE instance_ID = 1";
        connect.Open();
        da.InsertCommand = new SqlCommand(update, connect);
        da.InsertCommand.ExecuteNonQuery();
        connect.Close();
好的,这是我现在正在处理的表单的完整代码,显示的那个。大多数表单的结构都是这样的,所以如果我把这个做对了,其他表单就不会有任何问题。我正在我的电脑上测试,所以如果它在这里工作,在那里也应该工作

看看,我不知道该怎么办了

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace TheNamespace
{
public partial class submit_spending : Form
{
    public submit_spending()
    {
        InitializeComponent();
    }

    private void submit_button_Click(object sender, EventArgs e)
    {
        try
        {
            SqlConnection connect = new SqlConnection("Data Source=Localhost\\SQLExpress;Initial Catalog=TheDataBase;Integrated Security=True");
            SqlDataAdapter da = new SqlDataAdapter();

            /******************** Inserting ********************/
            string query = "INSERT INTO spending VALUES (@date, @amount_spent, @spent_on)";
            SqlCommand command = new SqlCommand(query);
            command.Parameters.AddWithValue("date", date_dateTimePicker.Value);
            command.Parameters.AddWithValue("amount_spent", Convert.ToDecimal(amount_spent_textBox.Text));
            command.Parameters.AddWithValue("spent_on", spent_on_textBox.Text);

            connect.Open();
            da.InsertCommand = new SqlCommand(query, connect);
            da.InsertCommand.ExecuteNonQuery();
            connect.Close();

            if (MessageBox.Show("Submitted.", "Spending submitted", MessageBoxButtons.OK) == DialogResult.OK)
            {
                this.Close();
            }
        }
        catch (Exception error)
        {
            MessageBox.Show(error.ToString());
        }
    }

    private void cancel_button_Click(object sender, EventArgs e)
    {
        this.Close();
    }
}
}

可能您在日期时间格式设置方面有问题,可以通过将系统日期时间格式更改为与计算机工作时相同的格式来解决,或者您可以在代码中做一些额外的工作。有关自定义日期时间格式,请查看以下内容:

可能您在日期-时间格式设置方面有问题,可以通过将系统日期-时间格式更改为与计算机工作时相同的格式来解决,也可以在代码中执行一些额外的工作。有关自定义日期时间格式,请查看以下内容:

只需使用
dateTime.ToString(“s”)
,无论计算机的文化设置如何,它都会以通用格式为您提供日期时间。

只需使用
dateTime.ToString(“s”)
,无论计算机的文化设置如何,它都会以通用格式提供日期时间。

您应该使用
参数.AddWithValue()
方法。我希望它能正确格式化
DateTime

string cmdText = "UPDATE table SET colX = @value WHERE id = @currId";
var cmd = new SqlCommand(cmdText, conn);
cmd.Parameters.AddWithValue("value", dateTimePicker1.Value);
cmd.Parameters.AddWithValue("currId", id);

您应该使用
Parameters.AddWithValue()
方法。我希望它能正确格式化
DateTime

string cmdText = "UPDATE table SET colX = @value WHERE id = @currId";
var cmd = new SqlCommand(cmdText, conn);
cmd.Parameters.AddWithValue("value", dateTimePicker1.Value);
cmd.Parameters.AddWithValue("currId", id);

理想情况下,您应该使用T-SQL语句中的
datetime
参数编写应用程序,这样就不会出现转换


另一种方法是在应用程序使用的连接上添加一个或多个连接。因此,您可以将格式更改为应用程序期望/使用的格式。

理想情况下,您应该使用T-SQL语句中的
datetime
参数编写应用程序,这样转换就不会出现

"UPDATE table SET the_date = '" + the_date_dateTimePicker.Value + "' WHERE instance_ID = 1";
另一种方法是在应用程序使用的连接上添加一个或多个连接。因此,您可以将格式更改为应用程序期望/使用的格式

"UPDATE table SET the_date = '" + the_date_dateTimePicker.Value + "' WHERE instance_ID = 1";
这里使用默认的CultureInfo转换为字符串。日期时间可以转换为“2012年5月29日”和“2012年5月29日”,具体取决于您工作站上选择的区域设置。但是,Sql Server可能配置为其他区域设置,因此您会遇到问题(Sql Server无法解析传递的日期时间字符串表示)

如果您不想以后再面对另一个与CultureInfo相关的问题,则必须使用参数化查询

这里使用默认的CultureInfo转换为字符串。日期时间可以转换为“2012年5月29日”和“2012年5月29日”,具体取决于您工作站上选择的区域设置。但是,Sql Server可能配置为其他区域设置,因此您会遇到问题(Sql Server无法解析传递的日期时间字符串表示)


如果不想以后再面对另一个与CultureInfo相关的问题,则必须使用参数化查询。

我认为在命令.Parameters中将值分配给date时需要指定SqlDBType。请将insert语句中指定的参数名称与Parameters.Add中指定的参数进行交叉检查

string sql = "INSERT INTO spending VALUES (@date, @amount_spent, @spent_on)";
 using (var cn = new SqlConnection("..connection string.."))
 using (var cmd = new SqlCommand(sql, cn))
   {
cmd.Parameters.Add("@date", SqlDbType.DateTime).Value = date_dateTimePicker.Value;
command.Parameters.AddWithValue("@amount_spent",Convert.ToDecimal(amount_spent_textBox.Text));
        command.Parameters.AddWithValue("@spent_on", spent_on_textBox.Text);

        connect.Open();
有时最好使用不变区域性在数据库中存储日期/时间之类的内容

DateTime date = date_dateTimePicker.Value.Date;
string sDate = date.ToString("dd-MM-yy",    System.Globalization.CultureInfo.InvariantCulture);
DateTime dateInsert = Convert.ToDateTime(sDate); 

我认为在command.Parameters中将值分配给date时需要指定SqlDBType。请将insert语句中指定的参数名称与Parameters.Add中指定的参数进行交叉检查

string sql = "INSERT INTO spending VALUES (@date, @amount_spent, @spent_on)";
 using (var cn = new SqlConnection("..connection string.."))
 using (var cmd = new SqlCommand(sql, cn))
   {
cmd.Parameters.Add("@date", SqlDbType.DateTime).Value = date_dateTimePicker.Value;
command.Parameters.AddWithValue("@amount_spent",Convert.ToDecimal(amount_spent_textBox.Text));
        command.Parameters.AddWithValue("@spent_on", spent_on_textBox.Text);

        connect.Open();
有时最好使用不变区域性在数据库中存储日期/时间之类的内容

DateTime date = date_dateTimePicker.Value.Date;
string sDate = date.ToString("dd-MM-yy",    System.Globalization.CultureInfo.InvariantCulture);
DateTime dateInsert = Convert.ToDateTime(sDate); 

您可能可以使用具有区域性不变格式的显式ToString来确保它在任何语言环境中都有效。这有点像黑客,但替换这一行:

command.Parameters.AddWithValue("date", date_dateTimePicker.Value);
这样做应该会起作用:

command.Parameters.AddWithValue("date", date_dateTimePicker.Value.ToString("s"));

这将为您提供一个ISO 8601格式的日期时间字符串,这是一个具有明确规范的国际标准。此外,此格式不受SQL Server实例上的SET-DATEFORMAT或SET-LANGUAGE设置的影响。

您可能可以使用具有区域性不变格式的显式ToString,以确保其在任何语言环境中都有效。这有点像黑客,但替换这一行:

command.Parameters.AddWithValue("date", date_dateTimePicker.Value);
这样做应该会起作用:

command.Parameters.AddWithValue("date", date_dateTimePicker.Value.ToString("s"));

这将为您提供一个ISO 8601格式的日期时间字符串,这是一个具有明确规范的国际标准。此外,此格式不受SQL Server实例上的SET-DATEFORMAT或SET-LANGUAGE设置的影响。

需要从选择器获取日期的代码。这不应该涉及到任何字符串到日期的转换。@TonyHopkinson有插入值的代码,这在那台计算机上是做不到的,所以我有捕获,这就是我得到错误图像的原因。@Tony实际上,考虑到他似乎在连接一个字符串来构建查询,“看来就是这样了。”安德烈·巴伯。当然,使用参数化的另一个原因queries@TonyHopkinson是否有一个简单的参数化查询解决方案可以工作