0

「Choose file ..」ボタンで CSV ファイルを dataGridView に正常にロードします。その後、「送信...」ボタン 3 をクリックすると、エラーが発生します。

追加情報: 条件式のデータ型が一致しません。

私の Access DB の最初の列は、自動付番の主キーであることに注意してください。それがここで重要かどうかはわかりません。

繰り返しになりますが、ご覧のとおり、CSV は完全に読み込まれます。"Date Filled" 列が "Date_Filled" に変更されました。この画像では数日経過しているため、気にしないでください。

これが私のコードとスクリーンショットです。すべてのヘルプは大歓迎です!

ここに画像の説明を入力

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.IO;
using System.Globalization;
using System.Configuration;
using System.Data.OleDb;

namespace csvToGrid
{
    public partial class Import : Form
        {
            DataSet dataset;
        }
    public partial class Import : Form
        {
            public Import()
                {
                    InitializeComponent();
                }
        public void button1_Click(object sender, EventArgs e)
            {
                string delimiter = ",";
                string tablename = "medTable";
                dataset = new DataSet();
                OpenFileDialog openFileDialog1 = new OpenFileDialog();
                openFileDialog1.Filter = "CSV Files (*.csv)|*.csv|All Files (*.*)|*.*";
                openFileDialog1.FilterIndex = 1;
                if (openFileDialog1.ShowDialog() == DialogResult.OK)
                    {
                        if (MessageBox.Show("Are you sure you want to import the data from \n " + openFileDialog1.FileName + "?", "Are you sure?", MessageBoxButtons.YesNo) == DialogResult.Yes)
                            {
                                filename = openFileDialog1.FileName;
                                StreamReader sr = new StreamReader(filename);
                                string csv = File.ReadAllText(openFileDialog1.FileName);
                                dataset.Tables.Add(tablename);
                                dataset.Tables[tablename].Columns.Add("Prescription");
                                dataset.Tables[tablename].Columns.Add("Customer_Name");
                                dataset.Tables[tablename].Columns.Add("Medication");
                                dataset.Tables[tablename].Columns.Add("Quantity");
                                dataset.Tables[tablename].Columns.Add("Date_Filled");

                                string allData = sr.ReadToEnd();
                                string[] rows = allData.Split("\r".ToCharArray());

                                foreach (string r in rows)
                                    {
                                        string[] items = r.Split(delimiter.ToCharArray());
                                        dataset.Tables[tablename].Rows.Add(items);
                                    }
                                this.dataGridView1.DataSource = dataset.Tables[0].DefaultView;
                                MessageBox.Show(filename + " was successfully imported. \n Please review all data before sending it to the database.", "Success!", MessageBoxButtons.OK);
                            }
                        else
                            {
                                this.Close();
                            }
                }
            }

        public string filename { get; set; }


        private void openFileDialog1_FileOk(object sender, CancelEventArgs e)
            {

            }

        private void Import_Load(object sender, EventArgs e)
            {

            }

        private void button4_Click(object sender, EventArgs e)
        {
            Application.Exit();

        }

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

        private void button3_Click(object sender, EventArgs e)

            //remove the semicolon, and add brackets below after line
            {

                var AccessCnn = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Persist Security Info=False;", @"C:\Search\KinneyDatabase.accdb");

                using (OleDbConnection accessCnn = new OleDbConnection(AccessCnn))
                {
                    //Create The Command
                    var accessCmd = new OleDbCommand(@"INSERT INTO script_Orders (script,cust_Name,drug,qty,fill_Date) VALUES (@Prescription, @Customer_Name, @Medication, @Quantity, @Date_Filled)", accessCnn);

                    OleDbParameter d = accessCmd.CreateParameter();
                    d.OleDbType = OleDbType.Date;

                    foreach (var row in dataset.Tables["medTable"].Rows)

                    {
                        accessCmd.Parameters.Clear();
                        accessCmd.Parameters.AddWithValue(@"Prescription","script");
                        accessCmd.Parameters.AddWithValue(@"Customer_Name", "cust_Name");
                        accessCmd.Parameters.AddWithValue(@"Medication", "drug");
                        accessCmd.Parameters.AddWithValue(@"Quantity", "qty");
                        accessCmd.Parameters.AddWithValue(@"Date_Filled", "fill_Date");
                        accessCnn.Open();
                        accessCmd.ExecuteNonQuery();
                        accessCnn.Close();
                    }
                }
            }
        }
    }

ここに画像の説明を入力

4

1 に答える 1

0

私はこれで試してみます:

accessCnn.Open();
foreach (var row in dataset.Tables["medTable"].Rows)
{
    accessCmd.Parameters.Clear();
    accessCmd.Parameters.AddWithValue("@Prescription",row["script"].ToString());
    accessCmd.Parameters.AddWithValue("@Customer_Name", row["cust_Name"].ToString());
    accessCmd.Parameters.AddWithValue("@Medication", row["drug"].ToString());
    accessCmd.Parameters.AddWithValue("@Quantity", Convert.ToInt32(row["qty"]));
    accessCmd.Parameters.AddWithValue("@Date_Filled", Convert.ToDate(row["fill_Date"]));
    accessCmd.ExecuteNonQuery();
}
accessCnn.Close();

また、ループに入る前にパラメーターを作成し、ループ内でパラメーターを破棄してループごとに再作成せずに値のみを変更して、クエリを最適化することもできます。

accessCmd.Parameters.Add("@Prescription", OleDbType.VarChar , 80);
accessCmd.Parameters.Add("@Customer_Name", OleDbType.VarChar, 80);
accessCmd.Parameters.Add("@Medication", OleDbType.VarChar, 80);
accessCmd.Parameters.Add("@Quantity", OleDbType.Integer);
accessCmd.Parameters.Add("@Date_Filled", OleDbType.Date);

accessCnn.Open();
foreach (var row in dataset.Tables["medTable"].Rows)
{
    accessCmd.Parameters["@Prescription"].Value = row["script"].ToString();
    accessCmd.Parameters["@Customer_Name"].Value = row["cust_Name"].ToString();
    accessCmd.Parameters["@Medication"].Value = row["drug"].ToString();
    accessCmd.Parameters["@Quantity"].Value = Convert.ToInt32(row["qty"]);
    accessCmd.Parameters["#Date_Filled"].Value = Convert.ToDate(row["fill_Date"]);
    accessCmd.ExecuteNonQuery();
}
accessCnn.Close();
于 2012-11-28T21:56:40.557 に答える