我有一个针对C-Tree数据库运行ODBC的查询,如下所示:
SELECT id, CONCAT(TO_CHAR(first_visit_date, 'YYYY-MM-DD '),
TO_CHAR('00:00:00', 'HH24')) AS date_first_visit FROM admin.v_patient
返回的结果如下:
1, 2015-03-07 00:00:00
2, 2016-01-27 00:00:00
当然完整的查询要大得多,但这是唯一给我带来麻烦的字段。当我尝试使用以下方法加载数据时:
using (OdbcConnection conn = new OdbcConnection(connectionString))
{
conn.Open();
using (OdbcCommand com = new OdbcCommand(cmdText, conn))
{
using (OdbcDataReader reader = com.ExecuteReader())
{
var rawData = new DataTable();
rawData.Load(reader);
}
}
}
我收到以下错误:
An exception of type 'System.Data.ConstraintException' occurred in System.Data.dll but was not handled in user code
Failed to enable constraints. One or more rows contain values violating non-null, unique, or foreign-key constraints.
我尝试将查询更新为
SELECT id, '2015-03-07 00:00:00 ' AS date_first_visit
FROM admin.v_patient
哪个有效...它应该是完全相同的东西,除了现在每一行都有相同的日期。对于grins,我尝试使用以下方法将其转换为varchar:
CONVERT('VARCHAR', TO_CHAR(first_visit_date, \'YYYY-MM-DD 00:00:00\') )
和其他方式,但真正的麻烦似乎是加载DataTable,但我无法弄清楚查询结果之间的区别,或者我的示例中我只指定字符串的结果。
我没有在表格上定义任何约束,这似乎消除了non-null, or foreign-key constraints
的错误,因为我可以在每一行中重复使用相同的日期,这似乎消灭了unique
,这让我想知道什么是错的。
答案 0 :(得分:0)
使用此代码替换rawData.Load(reader)
可解决此问题:
DataTable dtSchema = reader.GetSchemaTable();
List<DataColumn> listCols = new List<DataColumn>();
var rawData = new DataTable();
if (dtSchema != null)
{
foreach (DataRow drow in dtSchema.Rows)
{
string columnName = System.Convert.ToString(drow["ColumnName"]);
DataColumn column = new DataColumn(columnName, (Type)(drow["DataType"]));
column.Unique = false;
column.AllowDBNull = true;
column.AutoIncrement = false;
listCols.Add(column);
rawData.Columns.Add(column);
}
}
while (reader.Read())
{
DataRow dataRow = rawData.NewRow();
for (int i = 0; i < listCols.Count; i++)
{
dataRow[((DataColumn)listCols[i])] = reader[i];
}
rawData.Rows.Add(dataRow);
}