0

Visual C#2008Express。2010データベースにアクセスします。次のコードを使用すると、「基準式のデータ型の不一致」というエラーが表示されますが、txt85x11bw_Validatingイベントのコードを取得すると、問題なく機能します。日付型の不一致がどのようにあるかを理解しようとしています。

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.OleDb;

namespace GISReciepts
{
public partial class GISReceipts : Form
{
    public GISReceipts()
    {
        InitializeComponent();
    }

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

    private void cmdAdd_Click(object sender, EventArgs e)
    {
        string strSQL = "INSERT INTO Table1(Name1, Date1, CollectedBy, 85x11BW) VALUES(@Name, @Date, @CollectedBy, @85x11BW)";

        //OleDbConnection is a class that represents an open connection to a data source
        OleDbConnection myConnection = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Temp\\GISTest.accdb");
        //OleDbCommand is a class that represents an SQL statement or stored procedure to execute against a data source.(takes care of passing queries to the database.
        OleDbCommand myCommand = new OleDbCommand(strSQL, myConnection);
        myCommand.Parameters.AddWithValue("@Name", txtName.Text);
        myCommand.Parameters.AddWithValue("@Date", maskedTextBoxDate.Text);
        myCommand.Parameters.AddWithValue("@CollectedBy", txtCollectedBy.Text);
        myCommand.Parameters.AddWithValue("@85x11BW", txt85x11bw.Text);

        try
        {
            myConnection.Open();
            myCommand.ExecuteNonQuery();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
        finally
        {
            myConnection.Close();
           // MessageBox.Show("Entry Added");  //this is displaying even on errors & when no data is added to table
        }

    }

    private void GISReceipts_Load(object sender, EventArgs e)
    {
        maskedTextBoxDate.Text = DateTime.Today.ToString("MM/dd/yyyy");

        txt85x11bw.Validating += new CancelEventHandler(txt85x11bw_Validating);       
    }


    private void GISReceipts_FormClosing(object sender, FormClosingEventArgs e)
    {
        DateTime value;
        //DateTime.TryParse converts the srting representation of a date to its DateTime equivalent & returns a value that indicates whether the conversion succedded.
        if (!DateTime.TryParse(maskedTextBoxDate.Text, out value))
        {
            maskedTextBoxDate.Text = DateTime.Today.ToShortDateString();
        }

    }

    private void txt85x11bw_Validating(object sender, CancelEventArgs e)
    {
        if (string.IsNullOrEmpty(txt85x11bw.Text))
        {
            //do nothing
        }
        else
        {
            //initialize the variable numberEntered of type int
            int numberEntered;

            //int=integer TryParse=method that converts strings into integer (value, out result)
            if (int.TryParse(txt85x11bw.Text, out numberEntered))
            {
                //if number is less than 1 or more than 1,000
                if (numberEntered < 1 || numberEntered > 1000)
                    MessageBox.Show("You must enter a valid number");
                txt85x11bw.Clear();

            }
            //if conversion failed
            else
            {
                MessageBox.Show("You must enter a number");
                txt85x11bw.Clear();

            }
        }


    }

}

}

4

1 に答える 1

0

この行は、データ型テキストを含むパラメーターを追加します。代わりに、データベースでは、列85x11BWが数値型(検証コードを参照するint)であると想定しています。

    myCommand.Parameters.AddWithValue("@85x11BW", txt85x11bw.Text);

このように行を変更してみてください

    myCommand.Parameters.AddWithValue("@85x11BW", Convert.ToInt32(txt85x11bw.Text));

このようにして、AddWithValueメソッドに、DbTypeプロパティがに設定されたパラメーターを追加するように強制しますInt32@Date相対データテーブル列がタイプの場合、パラメーターについても同じ問題が発生する可能性がありますDateTime

編集txt85x11BWが空の場合、データテーブルのその列に受け入れるデフォルト値を決定する必要があります。NULLを受け入れる場合は、次のように書くことができます

        int numberEntered = 0;
        int.TryParse(txt85x11bw.Text, out numberEntered);
        if (numberEntered >= 1 && numberEntered <= 1000)
             myCommand.Parameters.AddWithValue("@85x11BW", numberEntered);
        else
             myCommand.Parameters.AddWithValue("@85x11BW", DBNull.Value);

編集2 検証イベントでは、値が正しい場合にも、コードはマスク編集の内容をクリアします。状態の後に中かっこが必要です

if (int.TryParse(txt85x11bw.Text, out numberEntered))
{
    //if number is less than 1 or more than 1,000
    if (numberEntered < 1 || numberEntered > 1000)
    {
        MessageBox.Show("You must enter a valid number");
        txt85x11bw.Clear();
    }
}
于 2013-01-31T15:26:14.310 に答える