Tentative illégale d'utilisation de la variable hôte Text / Byte - Insertion dans la colonne TEXT

c# dapper informix odbc

Question

Essayer d'insérer dans une table (colonne de texte) via Dapper et obtenir l'erreur d'Informix:

Illegal attempt to use Text/Byte host variable

J'ai écrit un petit programme pour simuler cela, et je suis toujours confronté à des problèmes.

Nous ne pouvons actuellement pas utiliser les pilotes Informix, car ils ne répondent pas à nos besoins.

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();
        }
    }
}

Structure de la table:

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

Réponse acceptée

Cette question pourrait être beaucoup plus simple que ne le suppose mon autre réponse; Je viens de remarquer que vous dites que la colonne est TEXT , mais vous passez un byte[] . Si vous le souhaitez, vous devriez probablement utiliser le type de données BYTE . Si vous souhaitez utiliser TEXT - il suffit de lui passer la string (par exemple "TEXT INPUT" ) et d'oublier l' Encoding .


Réponse d'expert

Je ne suis pas sûr de savoir quelle configuration j'aurais besoin de reprocher ceci… Cependant, voici quelque chose à essayer:

Informix semble vouloir des paramètres de position. Les versions récentes de dapper prennent en charge une syntaxe modifiée pour rendre cela plus pratique. Peux-tu essayer:

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

Aussi: essayez d'utiliser 'T' au lieu de "T" (caractère versus chaîne).

Cela peut aider si le problème est l'ordre des paramètres. Notez également que si cela fonctionne, vous pouvez également utiliser l'approche de type anonyme plus pratique pour spécifier les paramètres:

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")
});

Pensée finale finale: il n'y a pratiquement aucun scénario dans lequel Encoding.Default est correct ou approprié. Il est rarement utilisé, sauf par erreur.




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi