Получить исходный формат данных DataColumn
Как я могу получить исходный формат данных (в базе данных) объекта DataColumn?
У меня есть объекты DataColumn из DataTable, который является частью результата открытия запроса DBCommand SQL "выбрать".
Как получить информацию об исходных форматах данных, возвращаемых запросом (т. Е. "Varchar[50]" и т. Д.).
Я знаю DataColumn.DataType, но информация здесь недостаточно конкретна, например, невозможно различить varchar и char или различить дату и метку времени или получить максимальную длину поля varchar и так далее.
Получение информации из схемы базы данных сервера напрямую не является решением, которое я ищу, потому что текст запроса вводится пользователем, и я не хочу сам анализировать текст, чтобы выяснить, какой столбец какой таблицы используется и потому могут быть столбцы, которые не имеют соответствующей записи в базе данных (например, выберите ColumnA || Column B, 'SomeLiteral', 12 * ColumnC, null из MyTable)
2 ответа
Вы можете попробовать что-то вроде этого и изучить результаты (в таблице schemaTable).
DataTable schemaTable;
String sql = "select * from ...";
using (SqlConnection cnx = new SqlConnection(Properties.Settings.Default.ConnectionString))
{
using (SqlCommand cmd = new SqlCommand(sql, cnx))
{
cnx.Open();
using (SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.KeyInfo))
{
schemaTable = rdr.GetSchemaTable();
}
}
}
Похоже, вы берете специальную строку, получаете DataTable и пытаетесь определить его тип данных и длину.
Попробуйте другой подход, запросив SQL Server напрямую. Как вы обнаружили, DataColumn не имеет всей необходимой информации.
var cols = GetTableDetails("MyTable");
DataTable dt = GetDataTableFromUserSpecifiedQuery(userSqlQuery);
foreach (var col in dt.Columns)
{
var matching = cols.SingleOrDefault(x=>x.Name == col.ColumnName);
if (matching !=null)
{
//you now have the name, datatype, and length of the column
//matched from your table.
}
}
public List<Col> GetTableDetails(string tableName)
{
List<Col> cols = new List<Col>();
using (var conn = new SqlConnection("Data Source=server;Initial Catalog=Test1;Integrated Security=true;"))
using (var cmd = conn.CreateCommand())
{
conn.Open();
cmd.CommandText = @"SELECT syscolumns.name AS COLUMN_NAME,
systypes.name AS DATA_TYPE,
syscolumns.LENGTH AS LENGTH
FROM sysobjects
INNER JOIN syscolumns ON sysobjects.id = syscolumns.id
INNER JOIN systypes ON syscolumns.xtype = systypes.xtype
WHERE (sysobjects.xtype = 'U') and
sysobjects.name = @tableName
ORDER BY sysobjects.name, syscolumns.colid;";
cmd.Parameters.AddWithValue("@tableName", tableName);
SqlDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
cols.Add(new Col { Name= dr["COLUMN_NAME"],
DataType= dr["DATA_TYPE"],
Len = dr["LENGTH"] });
}
return cols;
}
}
public class Col {
public string Name{get;set;}
public string DataType{get;set;}
public int Len{get;set;}
}