C#MySQL对字段类型

时间:2016-03-21 11:57:26

标签: c# mysql

我遇到的问题是C#似乎误解了MySQL存储过程中的结果数据。

存储过程返回3个Int32列,后跟4个Varchar / String列...或者至少应该返回。

第1-5列返回正常,第7列也是如此,但是,出于某种原因,第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|

评论更新

  • 提供程序是Connector / NET 6.9.7
  • dt1是一个无类型的DataTable。
  • 存储过程的代码不可用。第六列的类型(Value)已由DBA验证为varchar(255)
  • 在连接字符串中指定charset = utf8并将blob视为utfs = yes也很遗憾无法解决问题。
  • 据信数据库版本为5.1.41

1 个答案:

答案 0 :(得分: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;
        }
    }
}

希望这有助于一些像我一样迷失的人