问题
I get a "Data type mismatch in criteria expression." error when running this code on one database but it works perfectly fine on another database. When trying to copy the relevent table to other database and run it from him the program fails again!
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;
namespace Project
{
public partial class Login : Form
{
public Login()
{
InitializeComponent();
}
private void Login_Load(object sender, EventArgs e)
{
}
private void label1_Click(object sender, EventArgs e)
{
}
private void LoginButton_Click(object sender, EventArgs e)
{
DAL conn = new DAL(@"|DataDirectory|\ProjectDB.accdb");
DataSet ds = conn.GetDataSet("Select * from Secretarys where SecretaryUsername = "+UserNameBox.Text.ToString());
if (ds.Tables[0].Rows[0][0].ToString().Equals(PassowrdBox.Text))
MessageBox.Show("asd","sdfa");
}
}
}
The class "DAL" I'm using.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data;
using System.Data.OleDb;
/// <summary>
/// Summary description for DAL
/// </summary>
public class DAL
{
private string dbPath;
private OleDbConnection conn;
private OleDbCommand command;
private OleDbDataAdapter adapter;
private string stQuery;
public DAL(string dbPath)
{
this.dbPath = dbPath;
string ConnectionString = string.Format(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0}", this.dbPath);
conn = new OleDbConnection(ConnectionString);
command = new OleDbCommand(stQuery, conn);
adapter = new OleDbDataAdapter(command);
}
public DataSet GetDataSet(string strSql)
{
DataSet ds = new DataSet();
command.CommandText = strSql;
adapter.SelectCommand = command;
adapter.Fill(ds);
return ds;
}
public bool InsertRow(string sqlInsert)
{
int rowsEffected;
command.CommandText = sqlInsert;
conn.Open();
rowsEffected = command.ExecuteNonQuery();
conn.Close();
return (rowsEffected > 0);
}
public string GetData(string strSql)//שולפת נתונים מהטבלת המשתמשים שנמצאת באקסס
{
string st = "";
DataSet ds = new DataSet();
command.CommandText = strSql;
conn.Open();
st = command.ExecuteScalar().ToString();
conn.Close();
return (st);
}
public void UpdateRow(string sqlInsert)//הוספת נתונים לטבלת החברים באקסס
{
command.CommandText = sqlInsert;
conn.Open();
command.ExecuteNonQuery();
conn.Close();
}
public void DeleteDataSet(DataSet ds)
{
OleDbCommandBuilder builder = new OleDbCommandBuilder(adapter);
adapter.DeleteCommand = builder.GetDeleteCommand();
conn.Open();
adapter.Update(ds);
conn.Close();
}
}
回答1:
With OleDb (as you are using) Criteria Mismatch Usually means that the data you are trying to put into the database can't be accepted because the database is expecting a different type of data. (i.e. the database expects an integer and you pass a double to it.) It can be a bit annoying but you'll need to double check all the datatypes of the columns in the database to make sure you are sending something it can handle.
In this case... maybe the the database column of SecretaryUsername is not actually a string? That seems odd but it's been known to happen. Some DB designers will name a field like that even though it contains an integer (to match up with an autonumber) You'll have to look at the Databases's expected datatype to know for sure
来源:https://stackoverflow.com/questions/14713299/data-type-mismatch-in-criteria-expression-error