繁体   English   中英

“条件表达式中的数据类型不匹配。” ACCESS 2010和C#

[英]“Data type mismatch in criteria expression.” ACCESS 2010 and C#

我正在尝试在Access 2010中进行查询,但它一直给我这个错误“条件表达式中的数据类型不匹配”。 通过“ dataCommand.ExecuteNonQuery();”行

 String sql1 = "INSERT INTO Formulario (Numero, Localidad, [Parroquia o Institucion], Fecha, [Id Institucion], Comunitaria, Observacion) VALUES (@Numero, @Localidad, [@Parroquia o Institucion], @Fecha, [@Id Institucion], @Comunitaria, @Observacion)";
 mi_conexion.Open();
 //insertar tabla formulario...........
 dataCommand.CommandText = sql1;
 dataCommand.Parameters.Add("@Numero", OleDbType.VarChar).Value = numero;
 dataCommand.Parameters.Add("@Localidad", OleDbType.VarChar).Value = textBox_localidad.Text;
 dataCommand.Parameters.Add("@Parroquia o Institucion", OleDbType.VarChar).Value = comboBox_instituciones.Text;
 dataCommand.Parameters.AddWithValue("@Fecha", "#" + fecha.Value.Date.Day.ToString() + "/" + fecha.Value.Date.Month.ToString() + "/" + fecha.Value.Date.Year.ToString() + "#");
 dataCommand.Parameters.Add("@Id Institucion", OleDbType.VarChar).Value = Int32.Parse(label_id2.Text);
 dataCommand.Parameters.Add("@Observacion", OleDbType.VarChar).Value = obs;
 if(radioButton_comunitaria.Checked)
 {
    dataCommand.Parameters.Add("@Comunitaria", OleDbType.VarChar).Value = true;
 }
 else
 {
    dataCommand.Parameters.Add("@Comunitaria", OleDbType.VarChar).Value = false;
 }
 dataCommand.ExecuteNonQuery();

我不知道可能是什么原因.....


我尝试了这个:

String sql1 = "INSERT INTO Formulario (Numero, Localidad, ParroquiaoInstitucion, Fecha, IdInstitucion, Comunitaria, Observacion) VALUES (?,?,?,?,?,?,?)";
mi_conexion.Open();
//insertar tabla formulario...........
dataCommand.CommandText = sql1;
dataCommand.Parameters.AddWithValue("Numero", numero);
dataCommand.Parameters.AddWithValue("Localidad", textBox_localidad.Text);
dataCommand.Parameters.AddWithValue("ParroquiaoInstitucion", comboBox_instituciones.Text);
dataCommand.Parameters.AddWithValue("Fecha", "#" + fecha.Value.Date.Day.ToString() + "/" + fecha.Value.Date.Month.ToString() + "/" + fecha.Value.Date.Year.ToString() + "#");
dataCommand.Parameters.AddWithValue("IdInstitucion", Int32.Parse(label_id2.Text));
if(radioButton_comunitaria.Checked)
{
    dataCommand.Parameters.AddWithValue("Comunitaria", true);
}
else
{
    dataCommand.Parameters.AddWithValue("Comunitaria", false);
}
dataCommand.Parameters.AddWithValue("Observacion", obs);
dataCommand.ExecuteNonQuery();

但这还行不通-_-.....

使用AddWithValue而不是Add方法。 Sql Server将为您确定数据的类型! 我给你举个例子。 此外,OLE DB不支持命名参数,仅支持未命名参数

dataCommand.Parameters.AddWithValue("?", true);

您应该以正确的顺序设置参数。 这是源代码,如何在MSDN中为OleDb添加参数

Access数据库(即使OleDb处于活动状态)也不知道以@开头的参数。

为了能够与MS Access数据库引擎一起使用参数,请使用:

PARAMETERS [parameter1] type, [parameter2] type, [parameterN] type;
SELECT <FieldList>
FROM <TableName>
WHERE FieldName = [parameter1] AND ...

有关更多信息,请参见: 参数声明(Microsoft Access SQL)

第二种方法是使用非命名参数:

SELECT <FieldList>
FROM <TableName>
WHERE FieldName = ? AND FieldName2 =?

但是我更喜欢使用命名参数。

OleDb希望您按其占位符在命令文本中出现的顺序添加参数。 使用Ms-Access的OleDb也接受名称以@开头的参数而不会出现问题(可能是为了简化到Sql Server的升级),但是您应该绝对遵守该顺序。

在您的代码中,将字段Comunitaria的参数添加到字段Observacion的参数之后。这会产生不匹配问题,因为OleDb将Comunitaria的值传递给字段Observacion,反之亦然。 然后,字段Comunitaria会收到一个不能转换为布尔值(是/否)的值。

尝试以这种方式更改代码

if(radioButton_comunitaria.Checked)
{
    dataCommand.Parameters.Add("@Comunitaria", OleDbType.VarChar).Value = true;
}
else
{
    dataCommand.Parameters.Add("@Comunitaria", OleDbType.VarChar).Value = false;
}
dataCommand.Parameters.Add("@Observacion", OleDbType.VarChar).Value = obs;
dataCommand.ExecuteNonQuery();

为此,您应该删除参数名称中的空格。 它只会给您带来麻烦,不需要它。

我建议也为Fecha字段使用正确的数据类型。 如果Access期望使用Date,请不要尝试构建替换字符串,就像在Access接口中执行插入操作一样。

dataCommand.Parameters.AddWithValue("@Fecha", new DateTime(fecha.Value.Date.Year,
                                                          fecha.Value.Date.Month,
                                                          fecha.Value.Date.Day)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM