非法尝试使用Text / Byte主变量 - 插入TEXT列

时间:2014-10-21 10:04:03

标签: c# odbc informix dapper

尝试通过Dapper插入表(文本列),并从Informix获取错误:

Illegal attempt to use Text/Byte host variable

我已经编写了一个小程序来模拟这个,我仍然面临着问题。

我们目前无法使用Informix驱动程序,因为它们不符合我们的需求。

using Dapper;
using System;
using System.Data.Odbc;
namespace DapperParamsTest
{
    class Program
    {
        static void Main(string[] args)
        {
            OdbcConnection conn = new System.Data.Odbc.OdbcConnection("Driver={IBM INFORMIX ODBC DRIVER (64-bit)}; Host=bylgia; Server=bylgia; Service=sqlexec; Protocol=onsoctcp; Database=DATABASE; Client_Locale=en_US.CP1252; DB_LOCALE=en_GB.1252");

            var dynParams = new DynamicParameters();

            dynParams.Add("np_c_ref",-1);
            dynParams.Add("np_np_type","T");
            dynParams.Add("np_text", System.Text.Encoding.Default.GetBytes("TEXT INPUT"), System.Data.DbType.Binary);

            conn.Execute("INSERT INTO notepads (np_c_ref, np_type,np_text) VALUES (?,?,?)",dynParams);

            Console.WriteLine("Written");
            Console.ReadLine();
        }
    }
}

表格结构:

CREATE TABLE notepad
(
    np_c_ref int,
    np_type char(1),
    np_text TEXT
)

2 个答案:

答案 0 :(得分:2)

我不确定我知道我需要重新设置这个设置...但是,这里有一些尝试:

看起来Informix需要位置参数。最近的dapper版本实际上支持修改后的语法,以使这更方便。你能尝试一下:

conn.Execute("INSERT INTO notepads (np_c_ref, np_type,np_text) VALUES (?np_c_ref?,?np_np_type?,?np_text?)",dynParams);

另外:尝试使用'T'代替"T"(字符与字符串)。

如果问题是参数顺序,这可能会有所帮助。另请注意:如果此方法有效,您还可以使用更方便的匿名类型方法来指定参数:

conn.Execute("INSERT INTO notepads (np_c_ref, np_type,np_text) VALUES (?np_c_ref?,?np_np_type?,?np_text?)",
new { np_c_ref = -1, np_np_type = "T",
    np_text = System.Text.Encoding.Default.GetBytes("TEXT INPUT")
});

最后的最终想法:几乎没有Encoding.Default正确或适当的情况。除了错误之外,很少使用它。

答案 1 :(得分:2)

这个问题实际上可能比我的其他答案设想简单得多;我刚刚注意到您说该列是TEXT,但您传递的是byte[]。如果您需要,您可能应该使用BYTE数据类型。如果您想使用TEXT - 只需将其传递给string(即"TEXT INPUT")并忘记Encoding