我遇到的问题是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|
评论更新
dt1
是一个无类型的DataTable。 Value
)已由DBA验证为varchar(255)
。答案 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;
}
}
}
希望这有助于一些像我一样迷失的人