2009-01-19 15 views
6

Çalışma zamanında, bir sql sunucu tablosu sütununun SqlDbType öğesinin ne olduğunu belirlemeye çalışıyorum.ADO.NET kullanarak bir tablodaki SqlDbType tablosunu nasıl alabilirim?

System.Data.SqlClient'te bunu gerçekleştirebilecek bir sınıf var mı, yoksa eşleştirmeyi kendim mi yapmalıyım? Ben

SELECT DATA_TYPE, CHARACTER_MAXIMUM_LENGTH 
FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE TABLE_CATALOG = '{0}' AND TABLE_SCHEMA = '{1}' 
    AND TABLE_NAME = '{2}' AND COLUMN_NAME = '{3}' 

DÜZENLEME geri bir dize temsilini alabilirsiniz: Ben yürütme makinesinin üzerinde hiçbir kontrole sahip gibi ben kurulacağı garanti edemez yüzden SMO kullanamazsınız. (Bu açık rp yapmamak için üzgünüm).

DÜZENLEME: Joel'e yanıt olarak, SqlConnection, bir tablo adı ve sütun adı geçtiğinde bana bir SqlDBType döndürecek bir işlev yapmaya çalışıyorum.

cevap

15

SQL Server size FMTONLY seçeneğini kullanabilirsiniz. Herhangi bir veri almadan bir sorgu çalıştırmanıza izin verir, sadece sütunları döndürür.

SqlCommand comm = new SqlCommand("SELECT * FROM Products", connection); 
using (SqlDataReader reader = comm.ExecuteReader()) 
{ 
    while (reader.Read()) 
    { 
     Type type = reader.GetSqlValue(0).GetType(); 
     // OR Type type = reader.GetSqlValue("name").GetType(); 
     // yields type "System.Data.SqlTypes.SqlInt32" 
    } 
} 
+0

Hey Bunu beğendim. – WOPR

+0

Bu gerçekten harika, ama çok dişli güvenli midir? SET FMTONLY ON ile kesintiye uğrayabilir ve başka biri boş bir recordset alır? –

+1

Bu hoş bir çözüm gibi görünüyor, ancak SQL Server'ın gelecekteki sürümlerinde kaldırılacağı için bu özelliği kullanmamak için bir uyarı var. – Naomi

1

SQL Server için SMO (SQL Server Yönetim Nesneleri) kullanın.

http://www.yukonxml.com/articles/smo/

Örneğin, bir tablonun sütunlarının her yerinde çapraz için bu kodu kullanabilirsiniz.

Server server = new Server(); 
Database database = new Database("MyDB"); 
Table table = new Table(database, "MyTable"); 

foreach (Column column in table.Columns) 
{ 
     WriteLine(column.Name); 
} 

İşte sizin için kullanılabilir sütun özelliklerinin tümü: http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.management.smo.column_members.aspx

+0

İyi bir yanıt, ancak yürütme makinesinin SMO'nun yüklü olup olmadığını bilmediğimden, korkarım ki, korkarım ki. – WOPR

2

sonunda verileri okumak için yapacaksanız, bunu yapabilirsin Sen pa olarak enum System.Data.CommandBehavior kullanabilirsiniz

string dataType = "nvarchar"; // result of the query in the original question 
var sqlType = (SqlDbType)Enum.Parse(typeof(SqlDbType), dataType, true); 
1

Eski soruyu, ancak yapmaya çalışıyorsun tüm ise dize veri_türü aldığım:

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"]; 

1

: SqlDbType enum, bir satır kod ile kombine asıl soruya sunulan sorgu hile olacaktır yöntem SqlCommand.ExecuteReader için ramter (System.Data.CommandBehavior.KeyInfo):

SqlCommand cmd = connection.CreateCommand(); 
cmd.CommandText = "select column from table"; 
SqlDataReader reader = cmd.ExecuteReader(System.Data.CommandBehavior.KeyInfo); 
SqlDbType type = (SqlDbType)(int)reader.GetSchemaTable().Rows[0]["ProviderType"]; 

Bu örnek, SQL kullanılarak örnek aşağıdaki gibidir: SET FMTONLY ON; FİLMİ KAPATIN. Ama sen SET FMTONLY'i kullanmadın. Ve bu durumda,
, tablodan veri almazsınız. Yalnızca meta verileri alırsınız.

İlgili konular