【问题标题】:Get the parameter prefix in ADO.NET在 ADO.NET 中获取参数前缀
【发布时间】:2011-08-01 21:02:33
【问题描述】:

我想使用列名作为参数,基于列列表生成几条 SQL 语句。

编辑:C#

var columns = new string[] { "COL1", "COL2" };
var tableName = "TABLE_1";
var prefix = "@"; // TODO get this from the provider factory

string sqlInsert = string.Format(
    "INSERT INTO {0}\n( {1}) VALUES\n({2})",
    tableName,
    string.Join(",  ", columns),
    string.Join(", ", columns.Select(c => prefix + c)));

生成的 SQL:

INSERT INTO TABLE_1
( COL1,  COL2) VALUES
(@COL1, @COL2)

这适用于 SqlClient。但我使用 System.Data 中的抽象类(DbCommand、DbParameter 等)和不同的数据提供者,如 Oracle、MySQL、Postgres 等,基于 app.config 中的连接字符串设置。因此我需要知道我必须使用哪个前缀。对于 MS-SQL 是 @,Oracle 使用 :,其余的我其实不知道。

有没有办法从提供者工厂获取这个前缀字符?

System.Data.SqlClient.SqlClientFactory.Instance没有这样的信息或者至少我找不到。

要不然,你能给我一份常用数据库的清单吗?

编辑:目标平台是 .NET 2 到 .NET 4,信息应该可以通过提供程序工厂获得。

【问题讨论】:

  • 你能提供你用来生成SQL的代码吗?

标签: .net database ado.net factory abstract


【解决方案1】:

有 2 个 DbCommandBuilder 方法可以帮助您,GetParameterName 和 GetParameterPlaceholder。这些是受保护的,因此您需要稍加思考才能使用它们。

查看我对以下问题的回答以了解实现(也包含在 DbExtensions 库中):

What are your favorite extension methods for C#? (codeplex.com/extensionoverflow)

【讨论】:

    【解决方案2】:

    我找到了答案,但我无法重现我是如何找到它的:

    http://www.codewrecks.com/blog/index.php/2007/09/06/about-parametermarkerformat/

    DbConnection 可以提供一个模式表,其中还包含用于创建命令参数名称的正确格式字符串,SqlClient 除外!!

    DbProviderFactory myFactory = DbProviderFactories.GetFactory(myProviderName);
    
    using (DbConnection myConnection = myFactory.CreateConnection())
    {
        myConnection.ConnectionString = mySettings.ConnectionString;
        myConnection.Open();
    
        string parameterMarker = myConnection
            .GetSchema(DbMetaDataCollectionNames.DataSourceInformation)
            .Rows[0][DbMetaDataColumnNames.ParameterMarkerFormat].ToString();
    
        myConnection.Close();
    }
    

    对于 SqlCclient parameterMarker 是 {0} 但应该是 @{0}。我将进一步调查以找出其他架构表列中包含的内容。

    【讨论】:

    • ParameterMarkerPattern 是{0},因为@ 已经包含在ParameterNamePattern 中,因此您应该同时检查两者。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-03
    • 2017-02-22
    • 2012-06-11
    • 2016-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多