【问题标题】:ADODB connection vs SqlConnection in C# use casesC# 用例中的 ADODB 连接与 SqlConnection
【发布时间】:2021-12-29 09:22:23
【问题描述】:

我正在尝试将一个旧项目(最初用 VB6 编写)转换为 C#。我遇到了以下 sn-p 代码(大致):

Dim  sSql     As String
Dim adoRs     As ADODB.Recordset

sSql = "EXEC " & PROC_GETEPORTPARAMETERVALUES & " " & iTemplateId & ", " & iViewId & ", " & 
g_sTenantSN

Set adoRs = Nothing

' Execute the query
Set adoRs = m_odbcDVConnection.OpenRecordSet(sSql, App.EXEName, Me.Name, csPROC_NAME)

If (adoRs.RecordCount > 0) Then

Do Until (adoRs.EOF)

'Some conditional statements within this block

Loop

End If

在网上做了一些研究后,我想出了以下 C# 的代码转换。我在这里使用了 SqlConnection。尽管我发现 ADODB 也可用于 C#。但不确定使用哪一个。

sSql = "EXEC " + PROC_GETEPORTPARAMETERVALUES + " " + iTemplateId + ", " + iViewId + ", " + 
        GlobalHelper.Tenant;

SqlConnection conn = new SqlConnection(ConfigurationManager.AppSettings["ConnectionString"]);

if (conn.State != ConnectionState.Open)
{
   conn.Open();
}

SqlCommand cmd = new SqlCommand(sSql);
cmd.CommandType = CommandType.Text;
SqlDataReader dr = cmd.ExecuteReader();

while (dr.Read())
{
   // Conditional statements
}

我不完全确定上述是否正确转换是否正确。但更重要的是,我想知道在 C# 项目中何时使用 ADODB 连接以及何时使用 SqlConnection。

据我了解,在上述情况下,我认为进程执行SQL命令和读取记录。

【问题讨论】:

  • 考虑在您的新项目中使用 Dapper 和 Dapper Contrib。 SqlConnection 是首选。避免 SQL 语句的字符串连接;它使它们容易受到 SQL 注入攻击。 Dapper 对输入参数进行了适当的参数化,这将避免这个问题。
  • Dapper 可以在 here 找到。 Dapper Contrib 是 here
  • 在 .NET 应用程序中始终使用托管 SqlClient API 而不是非托管 ADODB。 Dapper @RobertHarvey 建议的框架可以将其用于低级数据访问,
  • VB6 只有基于 COM 的 ADO(DB)。您在 C# 中看到的 ADODB 是同一个 COM 对象。但正如已经指出的那样,您应该尽可能使用 .NET Framework 的 SqlConnection(或 OleDbConnection)。过去可能存在这种奇怪的数据库解决方案,其中 ADO 提供程序可用,但尚未移植到 .NET。在 C# 中使用 ADODB 时就是这种情况。
  • .NET 中 ADODB 的另一个用例:当您有一个由 VB6 应用程序使用的 COM-interop dll 时,VB6 应用程序正在请求数据并期望它作为 ADODB.Recordset。

标签: c# sql-server vb6 ado


【解决方案1】:

ADODB 通常不用于 C#。您应该始终使用 SqlClient。

转换后的代码存在许多问题:

  • 您缺少using
  • 不需要,也不应该注入参数。使用SqlParameter 正确传递它们
  • 您还应该使用CommandType.StoredProcedure,然后命令文本就是过程名称。如果您想使用Text,则为默认值,无需设置。
  • 没有必要检查连接是否未打开,当然不是你刚刚创建的那样
using (SqlConnection conn = new SqlConnection(ConfigurationManager.AppSettings["ConnectionString"]))
using (SqlCommand cmd = new SqlCommand(PROC_GETEPORTPARAMETERVALUES))
{
    cmd.CommandType = CommandType.StoredProcedure;
    // Specify correct parameter type, add parameter length for strings
    cmd.Parameters.Add("@iTemplateId", SqlDbType.NOT_SURE_WHAT_YOU_WANT_HERE).Value = iTemplateId;
    cmd.Parameters.Add("@iViewId", SqlDbType.NOT_SURE_WHAT_YOU_WANT_HERE).Value = iViewId;
    conn.Open();
    using (SqlDataReader dr = cmd.ExecuteReader())
    {
        while (dr.Read())
        {
        // Conditional statements
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多