2011-09-19 42 views
10

Tôi có một DataTable lấy từ cơ sở dữ liệu SQL, như thế này:Làm thế nào để có được SqlType của một cột trong một DataTable?

using (SqlCommand cmd = new SqlCommand(query, _sqlserverDB)) 
{ 
    using (SqlDataAdapter adapter = new SqlDataAdapter(cmd)) 
    { 
     DataSet dataSet = new DataSet(); 
     adapter.Fill(dataSet); 
     result = (dataSet != null && dataSet.Tables != null && dataSet.Tables.Count > 0) ? dataSet.Tables[0] : null; 
    } 
} 

Khi tôi cố gắng để có được những DataType của mỗi cột thông qua dataColumn.DataType, tôi nhận được loại C# (Int32, Int64, String, vv).

CÂU HỎI: Làm cách nào để truy cập các kiểu dữ liệu SQL gốc (varchar, nvarchar, bigint ...) thay vì các loại C#?

Tôi đã thử dataColumn.DataType.UnderlyingSystemType và kết quả giống nhau.

Trả lời

9

bạn không thể vì System.Data.DataTable (hoặc DataColumn hoặc DataSet, hoặc DataRow ...) là một thùng chứa dữ liệu .NET chung hoạt động theo cùng một cách bất kể trên cơ sở dữ liệu cụ thể mà bạn đã tải dữ liệu của mình.

điều này có nghĩa là bạn đã sử dụng Trình kết nối .NET cho SQL Server, MySql, Access, PostgreeSQL hoặc bất kỳ thứ gì khác, các lớp DataTable và DataColumn luôn giống nhau và các đối tượng ADO.NET là chung để làm việc với bất kỳ công cụ db nào , do đó, các cột được nhập với các loại .NET như bạn đã phát hiện ra.

2

Như David nói ... bạn đang ở .NET vì vậy các loại sẽ là loại .NET. Đây là một danh sách các loại ánh xạ từ SQL Server để Net đó cho bạn thấy những gì NET gõ bạn sẽ kết thúc với một loại cột Sql cho .. hy vọng điều này sẽ giúp ..

http://msdn.microsoft.com/en-us/library/ms131092.aspx

28

Tất nhiên nó có thể lấy SqlDbType của một cột, câu trả lời là ở đây trên SO: link.

SqlCommand cmd = connection.CreateCommand(); 
cmd.CommandText = "SET FMTONLY ON; select column from table; SET FMTONLY OFF"; 
SqlDataReader reader = cmd.ExecuteReader(); 
SqlDbType type = (SqlDbType)(int)reader.GetSchemaTable().Rows[0]["ProviderType"]; 
+0

Câu trả lời này đưa tôi đi đúng hướng. Cảm ơn bạn! –

+0

bạn được chào đón :) – infografnet

+2

Thật không may, có một lưu ý trong tài liệu SQL Server 2012 để không sử dụng tính năng này. Xem http://msdn.microsoft.com/en-us/library/ms173839.aspx – Naomi

7
SqlConnection SqlCon = new SqlConnection("Data Source=(local);Database= dbname;Integrated Security=SSPI;"); 

SqlDataReader SqlDr; 

SqlCon.Open(); 
SqlCmd = SqlCon.CreateCommand(); 

SqlCmd.CommandText = "select * from Tablename"; 

SqlDr = SqlCmd.ExecuteReader(); 
SqlDr.Read(); 
int i=0; 
while (i < SqlDr.FieldCount) 
{ MessageBox.Show(SqlDr.GetDataTypeName(i)); i++;}' 
+0

Xin chào Madhukar và chào mừng bạn đến với StackOverflow. Xem xét thêm một số mô tả bằng lời nói mã của bạn làm gì. Điều này sẽ làm tăng chất lượng câu trả lời của bạn, giúp đỡ những người khác sẽ đọc nó trong tương lai tốt hơn, và cung cấp cho bạn nhiều upvotes hơn. Xem [Cách trả lời] (http://stackoverflow.com/questions/how-to-answer) để biết thêm chi tiết. – bytebuster

+0

Sử dụng SqlDataReader.GetDataTypeName() trả về kiểu máy chủ SQL gốc. SqlDataReader.GetFieldType() trả về kiểu .NET Framework. Tôi đã thấy hữu ích trước đây khi tôi cần xây dựng một câu lệnh T-SQL để thay đổi các kiểu hoặc kích cỡ cột cơ sở dữ liệu. –

0

Nếu bạn đang sử dụng DataReader -

SqlDataReader reader = cmd.ExecuteReader(); reader.GetDataTypeName(int ordinal)

nên làm việc nếu bạn muốn kiểu dữ liệu SQL của một cột

2

cách tiếp cận khác là để cho SQL làm việc cho bạn:

 SqlConnection rConn = connectToSQL(); //returns sql connection 

     SqlCommand SqlCmd = new SqlCommand(); 

     SqlCmd = rConn.CreateCommand(); 

     SqlCmd.CommandText = "SELECT ORDINAL_POSITION, " + 
           "COLUMN_NAME, " + 
           "DATA_TYPE, " + 
           "CHARACTER_MAXIMUM_LENGTH, " + 
           "IS_NULLABLE " + 
          "FROM INFORMATION_SCHEMA.COLUMNS " + 
          "WHERE TABLE_NAME = 'TableName'"; 
     SqlDataReader SqlDr = SqlCmd.ExecuteReader(); 

     SqlDr.Read(); 
     while (SqlDr.Read()) 
      { 
      var OrdPos = SqlDr.GetValue(0); 
      var ColName = SqlDr.GetValue(1); 
      var DataType = SqlDr.GetValue(2); 
      var CharMaxLen = SqlDr.GetValue(3); 
      var IsNullable = SqlDr.GetValue(4); 
      Console.WriteLine("ColName - " + ColName + " DataType - " + DataType + " CharMaxLen - " + CharMaxLen); 
      } 
+0

Điều này sẽ chỉ trả về phiên bản chuỗi của SqlDataTypes. OP đang tìm kiếm System.Data.SqlDbType enum. – JBond

Các vấn đề liên quan