2009-10-15 39 views

Trả lời

1

Tôi tìm thấy một số tùy chọn tại Dot Net PulseCodeProject. Tôi cuối cùng đã đi với mã CodeProject chuyển đổi từ VB.NET sang C#:

private SqlDbType GetDBType(System.Type theType) 
{ 
    System.Data.SqlClient.SqlParameter p1; 
    System.ComponentModel.TypeConverter tc; 
    p1 = new System.Data.SqlClient.SqlParameter(); 
    tc = System.ComponentModel.TypeDescriptor.GetConverter(p1.DbType); 
    if (tc.CanConvertFrom(theType)) { 
     p1.DbType = (DbType)tc.ConvertFrom(theType.Name); 
    } else { 
     //Try brute force 
     try { 
      p1.DbType = (DbType)tc.ConvertFrom(theType.Name); 
     } 
     catch (Exception) { 
      //Do Nothing; will return NVarChar as default 
     } 
    } 
    return p1.SqlDbType; 
} 

Tôi đã thực sự hy vọng khi thấy rằng đã có một số phương pháp System.Data.SqlClient bí mật ẩn để thực hiện chuyển đổi và tôi đã chỉ thiếu nó .

+0

Bất cứ ai có được điều này để biên dịch? Kể từ khi tc.ConvertFrom trả về một đối tượng tôi nhận được "Không thể chuyển đổi hoàn toàn kiểu 'đối tượng' thành 'System.Data.DbType'. Một chuyển đổi rõ ràng tồn tại (bạn thiếu một dàn diễn viên?)" –

+1

@AlanMacdonald: Xin lỗi về điều đó - xem của tôi chỉnh sửa, –

+0

cảm ơn. Tôi lo ngại rằng có thể cho thấy điều này không được kiểm tra bởi các thành viên nên tôi đã đi đến câu trả lời của Matt Miller vào lúc này –

6

Không có phương pháp hiện có để thực hiện việc này - bạn sẽ cần phải cuộn chức năng để thực hiện việc này hoặc lưu vào bộ nhớ cache Dictionary<Type, SqlDbType> để tra cứu.

0

Bạn có thể sao chép các DataTable như

DataTable newdt = DataTable.Copy(); 

Và Xóa các cột với các kiểu dữ liệu khác nhau và thêm chúng vào newdt của bạn.

Chỉ một cách tôi đã làm việc xung quanh nó trong quá khứ.

1

Một cái gì đó như thế này có thể là một khởi đầu tốt. Đó không phải là toàn diện, nhưng đã cho tôi đến nơi tôi cần phải đi:

Dictionary<Type, SqlDbType> GetSQLTypeConversionMap() 
{ 
    var result = new Dictionary<Type, SqlDbType>(); 
    result.Add(typeof(string), SqlDbType.VarChar); 
    result.Add(typeof(Int16), SqlDbType.Int); 
    result.Add(typeof(Int32), SqlDbType.Int); 
    result.Add(typeof(DateTime), SqlDbType.DateTime2); 
    return result; 
} 
8

Đây là giải pháp của tôi, trong đó sử dụng built-in chức năng NET:

/// <summary> 
/// Get the equivalent SQL data type of the given type. 
/// </summary> 
/// <param name="type">Type to get the SQL type equivalent of</param> 
public static SqlDbType GetSqlType(Type type) 
{ 
    if (type == typeof(string)) 
     return SqlDbType.NVarChar; 

    if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>)) 
     type = Nullable.GetUnderlyingType(type); 

    var param = new SqlParameter("", Activator.CreateInstance(type)); 
    return param.SqlDbType; 
} 

Cẩn thận rằng điều này sẽ luôn đặt dây để nvarchar (bất kỳ giải pháp chung cho vấn đề này sẽ có cùng một gotcha, bởi vì không có cách nào để biết chính xác SqlDbType). Khi sử dụng điều này cho các truy vấn SELECT hoặc UPDATE tham số đối với các cột không phải là NVarChar, hiệu suất của SqlServer sẽ giảm khi so sánh NChar/NVarChar với các kiểu Char/VarChar vì nó chuyển đổi các giá trị cho mỗi so sánh. Điều này bit tôi khó khăn gần đây (một quá trình đã đi từ mất 4 phút đến 140 + phút), vì vậy luôn luôn được rõ ràng về các loại tham số char của bạn khi bạn có thể! Tôi sẽ tưởng tượng các loại tương tự khác có thể có cùng một vấn đề, nhưng không có gì gây ra cho tôi một vấn đề (chưa).

+0

Đã chỉnh sửa để xóa ghi chú tình cờ của tôi đã bị khóa sau một giờ. –

0

trả lời trong this thread, nhưng nó khá ngắn gọn, vì vậy tôi sẽ tái quote nó ở đây:

Bạn có thể chuyển đổi TypeCode-DbType sử dụng phương pháp ConvertTypeCodeToDbType trong System.Web.UI.WebControls.Parameter lớp: Parameter.ConvertTypeCodeToDbType Method. Để có được TypeCode, bạn có thể sử dụng phương thức Type.GetTypeCode(Type type).