好吧,我试图对表进行简单的更新查询,但我一直收到此错误Incorrect syntax near the keyword 'DEFAULT'
。事情是。当ome值为NULL时,它只会出错,但我已经检查过并且IT DOES允许空值。这是我的查询代码
public void UpdateQuery(String[] valores)
{
conexion = this.Connections.OLEDBCONNECTION.ConnectionString;
String query = " UPDATE [UTB_CUENTAS] SET CODTYP=ISNULL(?,CODTYP), CODORG=ISNULL(?,CODORG), CODGRP=ISNULL(?,CODGRP), TXTDEN=ISNULL(?,TXTDEN),"
+ " IDEACC=ISNULL(?,IDEACC), CODAPP=ISNULL(?,CODAPP), NUMPLZ=ISNULL(?,NUMPLZ), CODCUR=ISNULL(?,CODCUR), DATING=ISNULL(?,DATING),"
+ " NUMACCCTE=ISNULL(?,NUMACCCTE), DATCAN=ISNULL(?,DATCAN), FLGESTADO=ISNULL(?,FLGESTADO), DATELI=ISNULL(?,DATELI),"
+ " DATUPD=ISNULL(?,DATUPD), TXTADR=ISNULL(?,TXTADR), CODUSR=ISNULL(?,CODUSR)"
+ " WHERE NUMACC = ?";
using (OleDbConnection con = new OleDbConnection(conexion))
{
con.Open();
using (OleDbCommand cmd = con.CreateCommand())
{
cmd.Parameters.Add("@CODTYP", OleDbType.VarChar, 3).Value = valores[1];
cmd.Parameters.Add("@CODORG", OleDbType.VarChar, 18).Value = valores[2];
cmd.Parameters.Add("@CODGRP", OleDbType.VarChar, 4).Value = valores[3];
cmd.Parameters.Add("@TXTDEN", OleDbType.VarChar, 150).Value = valores[4];
cmd.Parameters.Add("@IDEACC", OleDbType.Char, 1).Value = valores[5];
cmd.Parameters.Add("@CODAPP", OleDbType.VarChar, 2).Value = valores[6];
cmd.Parameters.Add("@NUMPLZ", OleDbType.VarChar, 3).Value = valores[7];
cmd.Parameters.Add("@CODCUR", OleDbType.Char, 3).Value = valores[8];
if (valores[9] == null)
cmd.Parameters.Add("@DATING", OleDbType.DBTimeStamp).Value = DBNull.Value;
else
cmd.Parameters.Add("@DATING", OleDbType.DBTimeStamp).Value = Convert.ToDateTime(valores[9]);
cmd.Parameters.Add("@NUMACCCTE", OleDbType.VarChar, 18).Value = valores[10];
if (valores[11] == null)
cmd.Parameters.Add("@DATCAN", OleDbType.DBTimeStamp).Value = DBNull.Value;
else
cmd.Parameters.Add("@DATCAN", OleDbType.DBTimeStamp).Value = Convert.ToDateTime(valores[11]);
cmd.Parameters.Add("@FLGESTADO", OleDbType.Char, 1).Value = valores[12];
if (valores[13] == null)
cmd.Parameters.Add("@DATELI", OleDbType.DBTimeStamp).Value = DBNull.Value;
else
cmd.Parameters.Add("@DATELI", OleDbType.DBTimeStamp).Value = Convert.ToDateTime(valores[13]);
cmd.Parameters.Add("@DATUPD", OleDbType.DBTimeStamp).Value = Convert.ToDateTime(valores[14]);
cmd.Parameters.Add("@TXTADR", OleDbType.VarChar, 100).Value = valores[15];
cmd.Parameters.Add("@CODUSR", OleDbType.VarChar, 7).Value = valores[16];
cmd.Parameters.Add("@NUMACC", OleDbType.VarChar, 18).Value = valores[0];
cmd.CommandText = query;
try
{
cmd.ExecuteNonQuery();
}
catch (OleDbException ex)
{
byte[] emptybytes = new byte[0];
this.Log("CustomMessage: Error en NUMACC: " + valores[0] + " | " + ex.Message, 0, emptybytes);
}
cmd.Parameters.Clear();
}
con.Close();
}
}
我已经给了" yyyy-MM-dd HH:mm:ss" datetime列的格式。当我从SQl Server Management Studio执行此操作时,它可以正常工作。现在,我知道OLEDB并不真正关心参数名称,它在查询中调用相同的顺序。这就是为什么我这样做的原因。
我只是使用
进行测试String query = " UPDATE [UTB_CUENTAS] SET CODTYP=ISNULL(?,CODTYP) WHERE NUMACC = ?"
并且仅使用第一个参数,它可以工作!但是使用第二个值CODORG会抛出错误。
在这种情况下,valores[2]
和valores[3]
是空值,但由于我在查询中使用ISNULL()
,我认为这不应该是一个问题。即使它是,该列允许空值,但不更新
答案 0 :(得分:1)
从我的评论中,null和DBNull.Value是不同的东西。试试
cmd.Parameters.Add("@CODORG", OleDbType.VarChar, 18).Value = valores[2] ?? (object)DBNull.Value;
答案 1 :(得分:0)
你必须使用dinamically创建WHERE clausole,检查程序中的值,如果为null则不向查询字符串添加值的sql代码并且不要向命令添加参数
答案 2 :(得分:0)
我的意思是以这种方式创建sql字符串...
String SQLquery = " UPDATE [UTB_CUENTAS] SET ";
if (valores[1] != null)
{
SQLquery = SQLquery + " CODTYP=?, " +
cmd.Parameters.Add("@CODTYP", OleDbType.VarChar, 3).Value = valores[1];
}
....所以对于所有的价值, 最后
//REMOVE THE LAST COMMA
SQLquery = SQLquery.Substring(0,SQLquery.lenght -2) + " WHERE NUMACC = ? "
cmd.Parameters.Add("@NUMACC", OleDbType.VarChar, 18).Value = valores[0];
cmd.CommandText = query;
cmd.ExecuteNonQuery();
并且优化了处理