2016-03-21 8 views
3

C#がMySQLストアドプロシージャの結果データを誤解しているように見える問題に直面しています。C#MySQLのフィールド型の誤った解釈

ストアドプロシージャは、3つのInt32列の後ろに4つのVarchar/String列を返します。または少なくともそれが必要です。

列1-5は正常に戻りますが、何らかの理由で列6がImage/Byte []列として解釈されているように見えますが、なぜストアドプロシージャがVarchar (255)列に格納されます。

これまでにこの問題に遭遇したことはありません。どんな助けもありがとう。

以下はC#コードです。

using (MySqlCommand command = connection.CreateCommand()) 
{ 
    command.CommandType = CommandType.StoredProcedure; 
    command.CommandText = "viewu"; 
    command.Parameters.AddWithValue("uname", "ausername"); 

    reader = command.ExecuteReader(); 

    dt1.Load(reader); 

    gridControl1.DataSource = dt1; 
} 

私はSPにアクセスできないので、そのコードを投稿することはできません。ただし、以下は結果セットの例です。私はそれが問題の原因を強調した値だと思うが、考えはない。

|ID1|ID2|Flagged|Att|Operation|Value|Type| 
|---|---|-------|---|---------|-----|----| 
|740|100|1  | |=~  |NULL |User| 
|740|100|1  | |!*  |. |Item| 
|740|100|1  | |:=  |PPP |Item| 
|740|100|1  | |:=  |**base-qos-tp,bb-qos-sch-map,8m,bb-qos-cl-dscp,bb-qos-rw-1p,-24,-24**|Item| 
|740|100|1  | |:=  |8MOS |Item| 

コメント

  • からUPDATEプロバイダは6.9.7
  • dt1が型なしデータテーブルであるNETコネクタ/です。
  • ストアドプロシージャのコードは使用できません。第6列のタイプ(Value)は、DBAによってvarchar(255)であることが確認されました。
  • 接続文字列でcharset = utf8を指定し、blobをutfs = yesとして扱うと、残念ながら問題の解決に失敗しました。
  • データベースのバージョンは、私が誤解すなわち根本原因の理由を発見していない5.1.41
+4

コードをしたとして、ビットが失われてしまった一部の人に役立ちますか?エラーメッセージ? – hagello

+0

うん。そして "それはすべき" - あなたはどうしたらそれが確実になるのですか?そして、それをreproするために十分なコードを投稿してください。助けて?より有能な人を雇う。さらに情報を提供してください。 – TomTom

+0

使用しているドライバ(どちらが?Connector/Net?something?)に問題がある可能性がありますが、コードまたはストアドプロシージャのいずれかに問題がある可能性が最も高いです。コードとメッセージを投稿してください。それは助けが不可能なので、返されるものは何も言及していません:DataTable? DataReader? NHibernateエンティティ? –

答えて

0

であると考えられています。しかし、私は適切な回避策を見つけました。

要するに、この回避策は、最初にDataTableの列を入力することです。結果を直接DataTableにロードするのではなく、行ごとに結果を読み取るようにします。次に、下のコードでバイト配列(b)を宣言してnullに設定し、後でそれを関連する列(値)の結果に設定します。次に、デフォルトのエンコーディング(私の場合)を使用して文字列に変換し、最終的にデータテーブルに行を追加します。

下記の完全なコード。

DataTable dt1 = new DataTable(); 

dt1.Columns.Add("ID1", typeof(Int32)); 
dt1.Columns.Add("ID2", typeof(Int32)); 
dt1.Columns.Add("Flagged", typeof(Boolean)); 
dt1.Columns.Add("Att", typeof(String)); 
dt1.Columns.Add("Operation", typeof(String)); 
dt1.Columns.Add("Value", typeof(String)); 
dt1.Columns.Add("Type", typeof(String)); 

MySqlDataReader reader = null; 

using (MySqlConnection connection = new MySqlConnection("connectionstring")) 
{ 
    connection.Open(); 

    try 
    { 

     using (MySqlCommand command = connection.CreateCommand()) 
     { 
      command.CommandType = CommandType.StoredProcedure; 

      command.CommandText = "viewu"; 

      command.Parameters.AddWithValue("uname", "ausername"); 

      reader = command.ExecuteReader(CommandBehavior.SequentialAccess); 

      if (reader.HasRows) 
      { 
       while (reader.Read()) 
       { 
        byte[] b = null; 

        int ID1 = reader.GetInt32(0); 
        int ID2 = reader.GetInt32(1); 
        bool Flagged = reader.GetBoolean(2); 
        string Att = reader.GetString(3); 
        string Operation = reader.GetString(4); 
        b = (byte[])reader.GetValue(5); 
        string Type = reader.GetString(6); 

        string Value = Encoding.Default.GetString(b); 

        dt1.Rows.Add(1ID, ID2, Flagged, Attribute, Op, Value, Type); 
       } 
      } 

      gridControl1.DataSource = dt1; 
     } 
    } 
} 

うまくいけば、これは私が

関連する問題