[英]C# "Data type mismatch in criteria expression, when adding date from dataset to database
使用“選擇文件..”按鈕將CSV文件成功加載到dataGridView1。 當我隨后單擊“提交...”按鈕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();
}
}
}
}
}
我將嘗試:
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();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.