我有一个带有c#和mysql的项目。为了查询,我准备了存储过程 和使用
public Sorgulama sp_call(string sp_query, Dictionary<string, object> parameters)
{
Sorgulama sorgulama = new Sorgulama();
sorgulama.hatasiz = true;
DataTable dt = new DataTable();
using (var con = new MySqlConnection(myDBstring))
{
try
{
con.Open();
using (MySqlCommand cmd = new MySqlCommand(sp_query, con))
{
cmd.CommandType = CommandType.StoredProcedure;
if (parameters != null) {
foreach (KeyValuePair<string, object> item in parameters)
{
object value = new object();
cmd.Parameters.AddWithValue(item.Key, item.Value);
}
}
var rdr = cmd.ExecuteReader();
dt.Load(rdr);
rdr.Close();
}
}
catch (Exception Ex)
{
sorgulama.hatasiz = false;
///
string hatalirowlar = "";
foreach (DataRow dr in dt.GetErrors())
{
hatalirowlar = hatalirowlar + "\n" + dr.RowError.ToString();
}
XtraMessageBox.Show(hatalirowlar);
////
XtraMessageBox.Show("Bağlantı problemi." + Ex.ToString());
}
finally
{
if (con.State == System.Data.ConnectionState.Open) con.Close();
}
}
sorgulama.obje = dt;
return sorgulama;
}
这是我的存储过程示例:
SELECT h.id AS hesapid FROM `evrak_bordrolar` AS b
LEFT JOIN `hesaplar` AS h ON b.hesapid=h.id;
当某些行具有相同的值时,此过程在phpmyadmin或sql应用程序(如navicat)上没有错误。但是它会在c#应用程序中抛出约束异常。
答案 0 :(得分:0)
找到解决方案:使用dataadapter.fill(datatable);
时,表没有约束。但就像在我的应用程序中一样,如果数据表由阅读器dt.Load(rdr);
加载,则约束默认为TRUE。因此必须创建具有FALSE约束实例的数据集。
var rdr = cmd.ExecuteReader();
using (DataSet ds = new DataSet() { EnforceConstraints = false })
{
ds.Tables.Add(dt);
dt.Load(rdr);
}