gpt4 book ai didi

c# - C# 中的多数据库支持

转载 作者:行者123 更新时间:2023-11-30 17:33:56 25 4
gpt4 key购买 nike

我的应用程序需要支持多个数据库。目前,它支持 Postgres,现在我正在添加对 Orcle 的支持,并可能在未来几天支持 SqlServer。

在问任何问题之前,让我们先看看代码。

IDbParser :

public interface IDbParser
{
IDbConnection GetDbConnection(string ServerName, string DbPortNumber, string Username, string Password, string DatabaseName);
IDbCommand GetDbCommand(string query, IDbConnection sqlConnection);
IDataParameter CreateParameter(string key, object value);
string GetDbQuery(DbQueries query);
}

OracleDbParser :

public class OracleParser : IDbParser
{
#region >>> Queries
private string SELECTGROUPSESSIONS = "....";
........
#endregion

public IDbCommand GetDbCommand(string query, IDbConnection sqlConnection)
{
var command = new OracleCommand();
command.CommandText = query;
command.Connection = (OracleConnection)sqlConnection;
command.CommandType = CommandType.Text;
command.CommandTimeout = 300;
return command;
}

public IDataParameter CreateParameter(string key, object value)
{
return new OracleParameter(key, value);
}

public IDbConnection GetDbConnection(string ServerName, string DbPortNumber, string Username, string Password, string DatabaseName)
{
connString = String.Format("Data Source=(DESCRIPTION = (ADDRESS_LIST = (ADDRESS=(PROTOCOL=TCP)(HOST={0})(PORT={1})))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME={2}))); Connection Timeout=60; User Id={3};Password={4};",
ServerName, DbPortNumber, DatabaseName, Username, Password);
return new OracleConnection(connString);
}

public string GetDbQuery(DbQueries query)
{
switch (query)
{
case DbQueries.SELECTGROUPSESSIONS:
return SELECTGROUPSESSIONS;
................
..............
default:
return String.Empty;
}
}
}

同样,Postgres 有解析器:

public class PostgresParser : IDbParser
{
#region >>> Queries
private string SELECTGROUPSESSIONS = "....";
........
#endregion

public IDbCommand GetDbCommand(string query, IDbConnection sqlConnection)
{
var command = new NpgsqlCommand();
command.CommandText = query;
command.Connection = (NpgsqlConnection)sqlConnection;
command.CommandType = CommandType.Text;
return command;
}

public IDataParameter CreateParameter(string key, object value)
{
return new NpgsqlParameter(key, value);
}

public IDbConnection GetDbConnection(string ServerName, string DbPortNumber, string Username, string Password, string DatabaseName)
{
string connString = String.Format("Server={0};Port={1};Timeout=60;CommandTimeout=300;" +
"User Id={2};Password={3};Database={4};",
ServerName, DbPortNumber, Username, Password, DatabaseName);
return new NpgsqlConnection(connString);
}


public string GetDbQuery(DbQueries query)
{
switch (query)
{
case DbQueries.SELECTGROUPSESSIONS:
return SELECTGROUPSESSIONS;
................
..............
default:
return String.Empty;
}
}
}

数据库解析器工厂:

 public class DatabaseParserFactory
{
public static IDbParser GetDbParser(string dbType)
{
CUCMDbType dbTypeName;
Enum.TryParse(dbType.ToLower(), out dbTypeName);
switch (dbTypeName)
{
case CUCMDbType.oracle:
return new OracleParser();
case CUCMDbType.postgres:
return new PostgresParser();
default:
return new PostgresParser();
}
}
}

查询执行:

 public void Query(string queryStatement, DbParameterColl parameters, Action<IDataReader> processReader)
{
using (SqlConnection)
{
IDbCommand selectCommand = null;
selectCommand = _factory.GetDbCommand(queryStatement, SqlConnection);
selectCommand.Parameters.Clear();

using (selectCommand)
{
if (parameters != null)
{
foreach (var param in parameters)
{
selectCommand.Parameters.Add(_factory.CreateParameter(param.Key, param.Value));
}
}

try
{
using (var reader = selectCommand.ExecuteReader())
{
processReader(reader);
}

}
catch (Exception ex)
{
Logger.DebugFormat("Unable to execute the query. Query : {0} . Exception: {1}", queryStatement, ex);
Debug.WriteLine("\n\n>> Error on executing reader. Exception :\n " + ex);
}
}
}
}

仅供引用:只有SELECT 查询,没有其他命令。

我将参数的值作为对象传递。那么,目前分配参数和执行查询没有问题。但在大多数博客和 stackoverflow 中,我可以看到人们一直在建议指定输入方向,最具体的是 Input type/DbType。我需要指定 DbType 吗?目前,我的代码运行良好,没有错误。但我担心,它可能会在生产中崩溃。

而且我无法控制参数的类型,它可以是任何东西。那么你们有什么建议呢?或者有更好的方法吗?

最佳答案

首先,你应该看看DbProviderFactories - 你的大部分代码重复了已经存在的标准功能。请注意,它在 .NET Core 中尚不可用(但将会可用)。

关于您的问题,通常您不需要指定参数方向 - 它被假定为默认值。数据库驱动程序通常可以根据您分配给参数的 CLR 值推断出数据库类型,但最好明确指定 DbType 以确保万无一失。

关于c# - C# 中的多数据库支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43086905/

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