Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# OleDb-关键字';默认值';_C#_Sql Server - Fatal编程技术网

C# OleDb-关键字';默认值';

C# OleDb-关键字';默认值';,c#,sql-server,C#,Sql Server,好吧,我正试图对一个表进行一个简单的更新查询,但我一直在关键字“DEFAULT”附近发现这个错误语法错误。事情是这样的。只有当ome值为NULL时才会出错,但我已经检查过了,它确实允许NULL值。这是我的查询代码 public void UpdateQuery(String[] valores) { conexion = this.Connections.OLEDBCONNECTION.ConnectionString; String query = " UPDATE [UTB

好吧,我正试图对一个表进行一个简单的更新查询,但我一直在关键字“DEFAULT”附近发现这个错误
语法错误
。事情是这样的。只有当ome值为NULL时才会出错,但我已经检查过了,它确实允许NULL值。这是我的查询代码

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();
    }
}
我为datetime列提供了“yyyy-MM-dd HH:MM:ss”格式。当我在SQLServerManagementStudio中执行此操作时,它会工作,但仅此而已。现在,我知道OLEDB并不真正关心参数名,它的工作顺序与查询中调用的顺序相同。这就是我这样做的原因

我只使用了

String query = " UPDATE [UTB_CUENTAS] SET CODTYP=ISNULL(?,CODTYP) WHERE NUMACC = ?" 
只使用第一个参数,它就工作了!但是使用第二个值CODORG它会抛出错误


在这种情况下,
valores[2]
valores[3]
是空值,但由于我在查询中使用了
ISNULL()
,我相信这不应该是问题。即使它是空的,列也允许空值,但它不会更新。您必须以友好方式创建WHERE子句,在程序中检查值,如果为空,则不要向查询字符串中添加值的sql代码,也不要向命令中添加参数。

我的意思是以这种方式以友好方式创建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();

而且处理也得到了优化

根据我的评论,null和DBNull.Value是不同的东西。试一试

cmd.Parameters.Add("@CODORG", OleDbType.VarChar, 18).Value = valores[2] ?? (object)DBNull.Value;

没有一个代码中有“DEFAULT”这个词……您没有显示正确的代码。这就是问题所在。我还没有写默认值,错误发生在哪一行?null和DBNull.Value是不同的东西。试试
cmd.Parameters.Add(“@CODORG”,OleDbType.VarChar,18)。Value=valores[2]??(object)DBNull.Value
您是否在您提到的较小的测试查询上测试了它?如果不是这样,则必须仔细检查数据库列设置。这是唯一可能导致此错误的地方。该参数永远不会有空值,已经进行了验证。您是否打算编辑其他答案?这里有一个编辑链接,但现在又有一个问题。我也做了一个insert查询,它工作得很好,但是我没有对字符串参数使用
DBNull.Value
。仅在datetime为null时使用它。它是如何在那里工作的,而不是在更新查询上?OleDb管理这两个不同的列吗?@Mokz不确定,但Insert可能使用了列的“默认”值,而更新将不再使用该值。