からどのように継承しIDbConnection
ますか? DatabaseType
1 つのプロパティ ( MS Access、SQL サーバー、Paradox など)を追加したいと思います。私が言えることIDbConnection
はインターフェイスであり、したがって、インターフェイス継承チェーン全体のすべてのメンバーを実装することを望んでいると思います。それは大変な作業のようです。に 1 つのプロパティを追加する最良の方法は何IDbConnection
ですか?
更新 私がやろうとしていることはこれです。頻繁に使用する 3 つのメソッドがあります。ExecuteReader、ExecuteNonQuery、ExecuteNonQueryGetIdentity です。これらは頻繁に使用され、パラメーター (IDbConnection Conn、文字列 SQLString、object[] SQLParams) があります。これら 3 つのメソッドとすべてのプロジェクト メソッドに DatabaseType を追加する最善の方法は、プロジェクトのコードを 1 行だけ更新する必要があるように、IDbConnection を「オーバーライド」することだと考えました。
パラメーターを追加して IDbCommand を作成する際に、私が異なる方法で行うことがいくつかあるため、DatabaseType を知りたいと思います。具体的には DateTime です。
例えば:
public static System.Data.IDataReader ExecuteReader(System.Data.IDbConnection Conn, string SQL, object[] SQLParams)
// return IDataReader from connection, SQL string and Params. Params can be null.
{
using (var cmd = Conn.CreateCommand())
{
cmd.CommandText = SQL;
AddParametersToCommand(cmd, SQLParams); // add parameters to IDbCommand object if params not null
return cmd.ExecuteReader();
}
}
private static readonly Regex regParameters = new Regex(@"@\w+", RegexOptions.Compiled);
public static void AddParametersToCommand(IDbCommand Cmd, object[] Parameters)
/* Creates and ads unique parameters to an IDbCommand object to the CommandText SQL string.
* Tested types with SQL Update statement in MS Access/SQL Server: boolean, int, DateTime, text
* Parameter names in CommandText must start with the '@' char and can be any unique word (letter or number).
* E.g. calling code: cmd.CommandText = "Select * From SiteUser Where Site > @1 And User > @NewParam"
*
* http://www.codeproject.com/Articles/15542/IDbDataParameter-error-in-NET re: some DateTime issues
*/
{
if (Parameters != null && Parameters.Length > 0)
{
MatchCollection cmdParams = regParameters.Matches(Cmd.CommandText);
var paramNames = new List<String>();
foreach (var el in cmdParams)
{
if (!paramNames.Contains(el.ToString())) // only add unique parameter names
paramNames.Add(el.ToString());
}
IDbDataParameter dp;
var dbType = GetDatabaseType(Cmd.Connection);
for (int n = 0; n < Parameters.Length; n++)
{
var param = Parameters[n];
dp = Cmd.CreateParameter();
dp.ParameterName = paramNames[n];
TypeCode myTypeCode = Type.GetTypeCode(param.GetType());
if (myTypeCode == TypeCode.DateTime) // this workaround is needed for MS Access and SQL Server
{
if (dbType == DatabaseType.Access)
{
dp.DbType = DbType.DateTime; // set dates as DbType.DateTime for MS Access and Paradox
dp.Value = param.ToString(); // Convert.ToDateTime(param).ToString("yyyy-MM-dd hh:mm:ss"));
//Note: MS access cannot store years before December 30, 1899. They will be stored for some other year.
// for example. Jan 1 0001 will be stored as 2001.
}
else if (dbType == DatabaseType.MSSql)
{
dp.DbType = DbType.DateTime2; // set dates as DbType.DateTime2 for SQL Server
dp.Value = param.ToString();
}
}
else
dp.Value = param;
Cmd.Parameters.Add(dp);
} // for n
} // if
}