【发布时间】: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 对输入参数进行了适当的参数化,这将避免这个问题。
-
在 .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