gpt4 book ai didi

.net - 如何在 .NET 中创建通用 SQL 参数?

转载 作者:行者123 更新时间:2023-12-03 01:41:27 25 4
gpt4 key购买 nike

根据 Microsoft 文档 Configuring Parameters ,“.NET Framework 数据提供程序以不同的方式处理命名和指定参数以及参数占位符”。

  • System.Data.SqlClient 使用 @parametername 格式的命名参数
  • System.Data.OleDbSystem.Data.Odbc 使用由问号 (?) 表示的位置参数标记
  • System.Data.OracleClient 使用 :parmname(或 parmname)格式的命名参数

我正在编写方法来返回将用于参数化语句的 SQL。如果我使用标准 SQL,这些语句应该可以移植到各种数据库。如何创建通常有效的参数,而不会将关注点从数据提供者泄漏到 SQL 组件?

最佳答案

只需避免 @ 并使用 System.Data.SqlClient/System.Data.OracleClient

顺便说一句,如果您希望它可移植,请使用 System.Data.IDbCommand 或 System.Data.Common.DbCommand

使用接口(interface)还是抽象类取决于个人喜好。
接口(interface)更合适,但是抽象类有一些接口(interface)中不可用的附加方法(例如 DataReader.HasRows)。我使用了该界面,但回想起来,这是一个错误。我应该使用抽象类(System.Data.Common.DbAnything 而不是 System.Data.IAnything)。

您可以为它们编写扩展方法“AddParameter”,也可以将 DAL 转换为抽象类,并添加方法 AddParameter,您可以在其中覆盖相应实例的变量名称。

public abstract class cDAL
{


// From Type to DBType
protected virtual System.Data.DbType GetDbType(Type type)
{
// http://social.msdn.microsoft.com/Forums/en/winforms/thread/c6f3ab91-2198-402a-9a18-66ce442333a6
string strTypeName = type.Name;
System.Data.DbType DBtype = System.Data.DbType.String; // default value

try
{
if (object.ReferenceEquals(type, typeof(System.DBNull)))
{
return DBtype;
}

if (object.ReferenceEquals(type, typeof(System.Byte[])))
{
return System.Data.DbType.Binary;
}

DBtype = (System.Data.DbType)Enum.Parse(typeof(System.Data.DbType), strTypeName, true);

// Es ist keine Zuordnung von DbType UInt64 zu einem bekannten SqlDbType vorhanden.
// http://msdn.microsoft.com/en-us/library/bbw6zyha(v=vs.71).aspx
if (DBtype == System.Data.DbType.UInt64)
DBtype = System.Data.DbType.Int64;
}
catch (Exception)
{
// add error handling to suit your taste
}

return DBtype;
} // End Function GetDbType


public virtual System.Data.IDbDataParameter AddParameter(System.Data.IDbCommand command, string strParameterName, object objValue)
{
return AddParameter(command, strParameterName, objValue, System.Data.ParameterDirection.Input);
} // End Function AddParameter


public virtual System.Data.IDbDataParameter AddParameter(System.Data.IDbCommand command, string strParameterName, object objValue, System.Data.ParameterDirection pad)
{
if (objValue == null)
{
//throw new ArgumentNullException("objValue");
objValue = System.DBNull.Value;
} // End if (objValue == null)

System.Type tDataType = objValue.GetType();
System.Data.DbType dbType = GetDbType(tDataType);

return AddParameter(command, strParameterName, objValue, pad, dbType);
} // End Function AddParameter


public virtual System.Data.IDbDataParameter AddParameter(System.Data.IDbCommand command, string strParameterName, object objValue, System.Data.ParameterDirection pad, System.Data.DbType dbType)
{
System.Data.IDbDataParameter parameter = command.CreateParameter();

if (!strParameterName.StartsWith("@"))
{
strParameterName = "@" + strParameterName;
} // End if (!strParameterName.StartsWith("@"))

parameter.ParameterName = strParameterName;
parameter.DbType = dbType;
parameter.Direction = pad;

// Es ist keine Zuordnung von DbType UInt64 zu einem bekannten SqlDbType vorhanden.
// No association DbType UInt64 to a known SqlDbType

if (objValue == null)
parameter.Value = System.DBNull.Value;
else
parameter.Value = objValue;

command.Parameters.Add(parameter);
return parameter;
} // End Function AddParameter


public virtual T GetParameterValue<T>(System.Data.IDbCommand idbc, string strParameterName)
{
if (!strParameterName.StartsWith("@"))
{
strParameterName = "@" + strParameterName;
}

return InlineTypeAssignHelper<T>(((System.Data.IDbDataParameter)idbc.Parameters[strParameterName]).Value);
} // End Function GetParameterValue<T>


}

然后在相应的提供程序中覆盖它:

public class cOleDb : cDAL
{




public overrideSystem.Data.IDbDataParameter AddParameter(System.Data.IDbCommand command, string strParameterName, object objValue)
{
strParameterName = "?";
return AddParameter(command, strParameterName, objValue, System.Data.ParameterDirection.Input);
} // End Function AddParameter


// Etc.

}

您可以通过读取连接字符串 web.config 条目中的 provider 来创建相应的类实例。

PS:System.Data.OracleClient 已弃用,请使用 ODP.NET(您仍然需要安装 Oracle 中的 native OracleClient dll [免费下​​载])

关于.net - 如何在 .NET 中创建通用 SQL 参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20120051/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com