4

varchar データ型から datetime データ型への変換で範囲外値エラーが発生しました

フォームを使用してテーブルにデータを入力しようとしています。フォーム検証と SQL サーバーの両方の日付形式はどちらも dd/mm/yy ですが、フォームから 12 日を超える日付でデータを送信しようとすると(例: 2012 年 13 月 12 日) 「varchar データ型から datetime データ型への変換により範囲外の値エラーが発生しました」という例外がスローされ、フォームにデータを入力しようとするとmm/dd/yy 形式では、「間違った日付形式」と表示されます。これは、dd/mm/yy 形式が正しい形式であることを意味すると考えられます

以下の私のフォームのコードは次のとおりです。

    private void btnAddProject_Click(object sender, EventArgs e)
    {
        DateTime startDate;
        DateTime endDate;

        if (txtProjectName.Text == "") //client side validation
        {
            MessageBox.Show("Enter Project Name");
            return;
        }

        try
        {
            startDate = DateTime.Parse(txtProjectStart.Text);
            endDate = DateTime.Parse(txtProjectEnd.Text);
        }
        catch (Exception)
        {
            MessageBox.Show("Wrong Date Format");
            return;
        }
        fa.CreateProject(txtProjectName.Text, startDate, endDate, (int)cbCustomers.SelectedValue, ptsUser.Id);
        txtProjectName.Text = "";
        txtProjectStart.Text = "";
        txtProjectEnd.Text = "";
        cbCustomers.SelectedIndex = 0;
        MessageBox.Show("Project Created");
        adminControl.SelectTab(2);
    }// end btnAddProject

そして、これは私のDAOのコードです:

public void CreateProject(string name, DateTime startDate, DateTime endDate, int customerId, int administratorId)
    {
        string sql;
        SqlConnection cn;
        SqlCommand cmd;
        Guid projectId = Guid.NewGuid();

        sql = "INSERT INTO Project (ProjectId, Name, ExpectedStartDate, ExpectedEndDate, CustomerId, AdministratorId)";
        sql += String.Format("VALUES('{0}', '{1}', '{2}', '{3}', {4}, {5})", projectId, name, startDate, endDate, customerId, administratorId);

        cn = new SqlConnection(Properties.Settings.Default.WM75ConnectionString);
        cmd = new SqlCommand(sql, cn);

        try
        {
            cn.Open();
            cmd.ExecuteNonQuery();
        }
        catch (SqlException ex)
        {
            throw new Exception("Error Creating Project", ex);
        }
        finally
        {
            cn.Close();
        }

    }//end CreateProject Method

これは私のファサードのコードです:

public void CreateProject(string name, DateTime startDate, DateTime endDate, int customerId, int administratorId)
    {
        dao.CreateProject(name, startDate, endDate, customerId, administratorId);
    }//end CreateProject
4

3 に答える 3

13

sqldatetime のようにsqldatetime変換を行うことができます

 var sqlFormattedDate = myDateTime.Date.ToString("yyyy-MM-dd HH:mm:ss");
于 2012-09-12T18:18:36.847 に答える
11

基本的に、 SQL でDateTime値を文字列として渡すべきではありません。パラメータ化された SQL を使用し、パラメータ値を直接設定するだけです。可能な限りパラメータ化された SQL を常に使用する必要があります。

  • コードとデータの分離が向上します
  • 問題のある変換を回避します(このような)
  • SQL インジェクション攻撃を回避します

さらに、例外処理は無意味に複雑です。usingステートメントを使用して、SqlExceptionバブルを直接上げてください-なぜそれをバニラで包む必要がありExceptionますか?

于 2012-09-12T17:51:33.940 に答える
-2
sql = "INSERT INTO Project (ProjectId, Name, ExpectedStartDate, ExpectedEndDate, CustomerId, AdministratorId)";
sql += String.Format("VALUES('{0}', '{1}', '{2}', '{3}', {4}, {5})", projectId, name, startDate.toString("dd-MMM-yyyy"), endDate.toString("dd-MMM-yyyy"), customerId, administratorId);

提案 : なぜInsertコードでステートメントを使用しているのですか? 代わりにストアド プロシージャを使用できます。

于 2012-09-12T17:53:14.023 に答える