1

このプログラムは 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();
    }
}
}
4

7 に答える 7

7

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);
于 2012-05-21T08:56:15.167 に答える
3

おそらく、日付時刻の形式に問題があります。システムの日付時刻形式を、動作していたコンピューターと同じ形式に変更するか、コードで追加の作業を行うことで解決できます。カスタムの日時形式については、こちらをご覧ください: http://msdn.microsoft.com/en-us/library/8kb3ddd4.aspx

于 2012-05-21T00:31:46.903 に答える
1

おそらく、明示的な 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 設定の影響を受けません。

于 2012-05-31T16:12:31.120 に答える
1

command.Parameters で日付に値を割り当てるときに 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();

データベースに日付/時刻などを保存するために不変の文化を使用する方が良い場合があります.CultureInfo.Invariantcultureを試すことができます

DateTime date = date_dateTimePicker.Value.Date;
string sDate = date.ToString("dd-MM-yy",    System.Globalization.CultureInfo.InvariantCulture);
DateTime dateInsert = Convert.ToDateTime(sDate); 
于 2012-05-30T02:12:29.760 に答える
1

理想的にdatetimeは、T-SQL ステートメントでパラメーターを使用してアプリケーションを記述し、変換がまったく発生しないようにする必要があります。

自由に使えるもう 1 つの方法はSET DATEFORMAT、アプリで使用される接続に を追加することです。したがって、フォーマットをアプリケーションが期待/使用するフォーマットに変更できます。

于 2012-05-28T08:38:46.657 に答える
0

を使用するだけdateTime.ToString("s")で、コンピューターの文化設定に関係なく、日付時刻がユニバーサル形式で表示されます。

于 2012-05-21T07:17:44.723 に答える
0
"UPDATE table SET the_date = '" + the_date_dateTimePicker.Value + "' WHERE instance_ID = 1";

デフォルトの CultureInfo を使用した String への変換は、ここで行われます。DateTime は、ワークステーションで選択された地域設定に応じて、「29/05/2012」と「05/29/2012」の両方に変換できます。ただし、Sql Server が別の地域設定用に構成されている可能性があるため、問題が発生します (SQL Server は渡された DateTime の文字列表現を解析できません)。

後で別の CultureInfo 関連の問題に直面したくない場合は、パラメーター化されたクエリを使用する必要があります。

于 2012-05-29T14:53:21.547 に答える