C#データ型をSQL Serverデータ型に「変換」するにはどうすればよいですか(これSqlDbType
は既知です)
すなわち:
C# -> "String"
SQL Server -> N'String'
C#データ型をSQL Serverデータ型に「変換」するにはどうすればよいですか(これSqlDbType
は既知です)
すなわち:
C# -> "String"
SQL Server -> N'String'
これを試してください:これは拡張クラスなので、追加時にこれらのメソッドを使用するファイルで:
using Utility;
コードは次のとおりです。
using System;
using System.Data;
using Microsoft.SqlServer.Server;
namespace Utility
{
public static class TypeExtension
{
public static SqlDbType ToSqlDbType(this Type clrType)
{
var s = new SqlMetaData("", SqlDbType.NVarChar, clrType);
return s.SqlDbType;
}
public static Type ToClrType(SqlDbType sqlType)
{
switch (sqlType)
{
case SqlDbType.BigInt:
return typeof (long?);
case SqlDbType.Binary:
case SqlDbType.Image:
case SqlDbType.Timestamp:
case SqlDbType.VarBinary:
return typeof (byte[]);
case SqlDbType.Bit:
return typeof (bool?);
case SqlDbType.Char:
case SqlDbType.NChar:
case SqlDbType.NText:
case SqlDbType.NVarChar:
case SqlDbType.Text:
case SqlDbType.VarChar:
case SqlDbType.Xml:
return typeof (string);
case SqlDbType.DateTime:
case SqlDbType.SmallDateTime:
case SqlDbType.Date:
case SqlDbType.Time:
case SqlDbType.DateTime2:
return typeof (DateTime?);
case SqlDbType.Decimal:
case SqlDbType.Money:
case SqlDbType.SmallMoney:
return typeof (decimal?);
case SqlDbType.Float:
return typeof (double?);
case SqlDbType.Int:
return typeof (int?);
case SqlDbType.Real:
return typeof (float?);
case SqlDbType.UniqueIdentifier:
return typeof (Guid?);
case SqlDbType.SmallInt:
return typeof (short?);
case SqlDbType.TinyInt:
return typeof (byte?);
case SqlDbType.Variant:
case SqlDbType.Udt:
return typeof (object);
case SqlDbType.Structured:
return typeof (DataTable);
case SqlDbType.DateTimeOffset:
return typeof (DateTimeOffset?);
default:
throw new ArgumentOutOfRangeException("sqlType");
}
}
}
}
まず、MSDN からマッピング リストを取得できます。それらはここにあります。
次に、ハッシュ テーブル (HashTable) を作成して 1 つの型を検索し、それを関連する SqlDbType に変換します。このようなもの:
private static types = new HashTable<Type, SqlDbType>();
public static SqlDbType GetSqlDbType(Type type)
{
if (types == null)
{
var types = new HashTable<Type, SqlDbType>();
types.Add(int.GetType(), SqlDbType.Int);
// And so forth...
}
return types[type];
}
または、その趣旨の言葉。当然、StyleCop への準拠と保守性のためにリファクタリングします。(これは、IDE を使用せず、コーヒーを 1 杯飲んだだけで、頭のてっぺんから書いたものです。)
編集
.NET 文字列の解決を処理する場合、これはあいまいになる可能性があることに注意してください。varchar、nvarchar、テキスト、またはメモですか? そのような場合、このメソッドには知る方法がなく、テーブルと列の名前 (またはプロシージャとパラメーターの名前) に基づいてメソッドを呼び出した後、より多くの情報に基づいた決定を下さなければならない可能性があります。
そのような変換を行う方法はわかりませんが、おそらくもっと良い方法があります:
C#を使用してSQLクエリに値を挿入するとします。
なぜパラメータを使用しないのですか?
それ以外の:
SqlCommand command =
new SqlCommand(String.Format(
"SELECT * FROM MyTable WHERE mycolumn = {0}",
ConvertValueToSql(whateverobject)));
// ConvertValueToSql is what you are asking basically
これを試してみてください:
// Conversion list of used types
Dictionary<Type, SqlDbType> typeConversion = new Dictionary<Type, SqlDbType>();
typeConversion.Add(typeof(String), SqlDbType.NVarChar);
typeConversion.Add(typeof(Int32), SqlDbType.Integer);
// you can even do this if you want
typeConversion.Add(typeof(MyCustomImageClass), SqlDbType.VarBinary);
typeConversion.Add(typeof(MyOtherNiceClass), SqlDbType.NVarChar);
// In the method
SqlCommand command = new SqlCommand("SELECT * FROM MyTable WHERE mycolumn = @Value");
command.Parameters.Add(new SqlParameter("@Value", typeConversion[whateverobject.GetType()]) { Value = whateverobject } );