Erreur SqlBulkCopy Unicode / UTF8

c# nvarchar special-characters sqlbulkcopy

Question

J'utilise la fonctionnalité c # SqlBulkCopy pour enregistrer des enregistrements avec des valeurs multilingues codées UTF8. Mon champ de base de données est 'NVARCHAR (max)' et la valeur à enregistrer est æˆ'å¤šè¨ € èªžã §æˆ '. Mais cela économise en tant que '???????' . Est-il possible d'enregistrer cette valeur japonaise / multilingue exacte via SqlBulkCopy .

row["ParameterValue"] = RegData.ParamValue;

J'ai débogué et vérifié la ligne ci-dessus aussi. Mais les données arrivent au-dessus de la ligne également parfaitement. Après cette ligne, je suis en train d'exécuter

bulkCopy.WriteToServer(dataTable);

(J'ai essayé cela avec une simple insertion de base de données et son bon fonctionnement. Mais j'ai des millions d'enregistrements à enregistrer à la fois. Une insertion de base de données simple n'est pas bonne pour moi)

Réponse acceptée

' ??????? 'est le résultat que j'attendrais de:

select cast(N'我多言語で我' as varchar(max)) 

L'insertion dans une colonne NVARCHAR via un DataTable nouvellement créé avec une colonne string semble fonctionner pour moi ...

Si vous exécutez une trace de profileur SQL, vous devriez voir une instruction insert bulk ... avec le type de données utilisé pour le dataset en bloc (nb, vous ne verrez pas les valeurs).

Si ce champ et le champ cible correspondent au type NVARCHAR correct, des traitements côté serveur sont peut-être en cours?

Edit: la suivante fonctionne pour moi

    // insert code to create SqlConnection
    var dbName = string.Format("Test{0}", Environment.TickCount);
    var command = connection.CreateCommand();
    command.CommandText = string.Format("create database {0}", dbName);
    command.ExecuteNonQuery();
    command.CommandText = string.Format("use {0}", dbName);
    command.ExecuteNonQuery();
    try
    {
        command.CommandText = "create table Test (Value nvarchar(max))";
        command.ExecuteNonQuery();

        var dataTable = new DataTable();
        dataTable.Columns.Add("Value", typeof(string));

        var row = dataTable.NewRow();
        row["Value"] = "我多言語で我";
        dataTable.Rows.Add(row);

        var sqlBulkCopy = new SqlBulkCopy(connection);
        sqlBulkCopy.DestinationTableName = "Test";
        sqlBulkCopy.WriteToServer(dataTable);

        Console.WriteLine("Please check the following query:");
        Console.WriteLine(string.Format("select * from {0}..Test", dbName));
        Console.ReadKey();                
    }
    finally
    {
        command.CommandText = string.Format("drop database {0}", dbName);
        command.ExecuteNonQuery();
    }


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