Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何更改DataTable中列的数据类型_C#_Sql Server_Datatable_Oledb_Oledbcommand - Fatal编程技术网

C# 如何更改DataTable中列的数据类型

C# 如何更改DataTable中列的数据类型,c#,sql-server,datatable,oledb,oledbcommand,C#,Sql Server,Datatable,Oledb,Oledbcommand,我使用以下代码读取SELECT Sql查询,然后从中填充我的DataTable dt是我的DataTable,cs是我的连接字符串,query是Sql脚本: using (OleDbConnection conn = new OleDbConnection(cs)) { conn.Open(); OleDbCommand cmd = new OleDbCommand(query, conn); dt.Load(cmd.ExecuteReader()); conn.

我使用以下代码读取SELECT Sql查询,然后从中填充我的DataTable dt是我的DataTable,cs是我的连接字符串,query是Sql脚本:

using (OleDbConnection conn = new OleDbConnection(cs))
{
    conn.Open();
    OleDbCommand cmd = new OleDbCommand(query, conn);
    dt.Load(cmd.ExecuteReader());
    conn.Close();
}
它工作正常,我的DataTable将填充查询返回的内容。 但是我希望我的DataTable只包含字符串varchar值,而不管我的查询说什么。 例如,如果我的问题是:

SELECT 1 AS ID, 'John' AS Name
然后,我的Datatable的ID值将是一个整数,而我希望所有内容都是字符串。
如何实现这一点?

没有直接的方法来指定结果应全部为字符串。您不能简单地指示DataTable.Load将每个类型转换为字符串

你的选择是:

通过迭代将DataTable中的每个值转换为字符串 每行和每列。 如果可能的话,将SQL查询中的每一列转换/强制转换为 瓦尔查尔 这可以让你开始

DataTable dtAllString = new DataTable();
foreach (DataColumn column in dt.Columns)
{
    dtAllString.Columns.Add(column.ColumnName, typeof(string));
}

foreach (DataRow row in dt.Rows)
{
    List<string> columnValues = new List<string>();
    foreach (DataColumn col in dt.Columns)
    {
        columnValues.Add(Convert.ToString(row[col]));
    }
    dtAllString.Rows.Add(columnValues.ToArray());
}

它需要是DataTable中的字符串,还是需要是其他地方的字符串,例如在UI中显示时?退一步,这里解决的问题是什么?@David它需要是数据表中的字符串。问题是,我不希望DataTable的列类型为integer或string以外的任何其他类型。在这种情况下,最直接的方法是将查询中的所有内容转换为字符数据,以便转换对DataTable完全透明。我怀疑可能有更好/更干净的方法来解决这个问题,但在对问题一无所知的情况下,很难说。只要“为什么”是因为我喜欢它,那么“如何”就相当模糊,很容易导致问题范围之外的其他问题。@David我从来没有说过,因为我喜欢它。我只需要我的数据表是统一的字符串,因为这就是我需要数据的方式。你需要你的数据是字符串,因为你需要你的数据是字符串?这叫做重言式。因为我觉得这是一个非常恰当的解释。我不是在指责你什么,只是指出了解决问题和一时兴起之间的区别。后者很容易引起其他问题。看起来没问题。但如果我没弄错的话,这将使处理时间加倍,对吗?我的意思是,你首先要填写数据表,然后再检查整个过程一次。然而,如果这是唯一的出路,那么你的答案是正确的,我很乐意选择。是的。它必须在每一行中循环。但您并没有其他方法,因为一旦将数据填充到表中,就不能更改列类型@欢迎光临。请随意要求任何修改:@Pedram
// Create a temporary table
DataTable dtNew = new DataTable();
for(int i=0;dt.Columns.Count;i++)
{
    dtNew.Columns.Add(dt.Columns[i].ColumnName,typeof(string));
}


// Add data to new table
for(int i=0;dt.Rows.Count;i++)
{
   dtNew.Rows.Add();
   for(int j=0;dt.Columns.Count;j++)
   {
      dtNew.Rows[i][j] = dt.Rows[i][j];
   }        
}

dt=null;
dt=dtNew.Copy();