【问题标题】:Correct MS SQL Update statement syntax C# with ADODB.Parameters?使用 ADODB.Parameters 更正 MS SQL 更新语句语法 C#?
【发布时间】:2017-01-25 05:18:49
【问题描述】:

这是适用于 Insert 的代码 - 我只需要帮助将其转换为带有值和 where 子句语法的 Update。

 ADODB.Command cmdInsert = new ADODB.Command();
 cmdInsert.ActiveConnection = conn;

 cmdInsert.CommandText = "INSERT INTO ExchangeTypes(MarketSelectionId) VALUES (?)";

 //Update statement to be modelled:
 //cmdUpdate.CommandText = "Update ExchangeTypes SET
 //LayOdds = '" & layOdds & "'" & ", 
 //Size='" & laySize & "' WHERE
 //MarketId='" & marketid & "'" and SelectionId='" & selectionid & "'"

 cmdInsert.CommandType = ADODB.CommandTypeEnum.adCmdText;

// Append the parameters 
ADODB.Parameter paramMS = cmdInsert.CreateParameter(
           "MarketSelectionId",                         // Parameter name 
           ADODB.DataTypeEnum.adVarChar,                // Parameter type (adVarChar) 
           ADODB.ParameterDirectionEnum.adParamInput,   // Parameter direction 
           200,                                         // Max size 
           umarketiduselectionid);                      // Parameter value 

           cmdInsert.Parameters.Append(paramMS);

           object nRecordsAffected = Type.Missing;
           object oParams = Type.Missing;
           cmdInsert.Execute(out nRecordsAffected, ref oParams,
           (int)ADODB.ExecuteOptionEnum.adExecuteNoRecords);

【问题讨论】:

  • 这看起来你正在开始构建一些容易受到 sql 注入攻击的东西。

标签: c# sql-server adodb


【解决方案1】:

ADODB 是古老且已弃用的。它的存在仅是为了在您将其向前移植时向后兼容旧的 vb6 时代代码。它应该绝不用于新代码。

尝试使用 ADO.Net 代替插入:

using (var conn As new SqlConnection("connection string here"))
using (var cmd As new SqlCommand("INSERT INTO ExchangeTypes(MarketSelectionId) VALUES (@MarketSelectionId)", conn)
{
    cmd.Parameters.Add("@MarketSelectionId", SqlDbType.VarChar, 200).Value = umarketiduselectionid;

    conn.Open();
    cmd.ExecuteNonQuery();
}

然后 UPDATE 查询将如下所示:

using (var conn As new SqlConnection("connection string here"))
using (var cmd As new SqlCommand("Update ExchangeTypes SET LayOdds = @LayOdds, Size = @LaySize WHERE MarketId= @MarketId AND SelectionId = @SelectionID ", conn)
{
    //Guessing at your column types/lengths here
    cmd.Parameters.Add("@LayOdds", SqlDbType.VarChar, 200).Value = layOdds;
    cmd.Parameters.Add("@LaySize", SqlDbType.Int).Value = laySize;
    cmd.Parameters.Add("@MarketId", SqlDbType.Int).Value = marketid;
    cmd.Parameters.Add("@SelectionId", SqlDbType.Int).Value = selectionid;

    conn.Open();
    cmd.ExecuteNonQuery();
}

【讨论】:

  • 非常感谢乔尔。你可以说我上一次编程是在 15 年前,那时还没有使用这些技术。我将根据您的建议进一步更改与 ADO.Net 的连接。非常感谢。
  • 我实际上想要做的是遍历一个表并建立一个带有 ID 列表的 JSON 字符串,并在每 40 次迭代后发送 JSON 请求并使用返回的 40 个 JSON 项目使用 where 子句进行更新,其中包含 40 个返回的 JSON 请求中的详细信息。并重复每读取 40 条记录。我知道我需要 2 个查询 - 一个只是循环的选择不同,另一个是更新位置。您能否像使用 select 一样提供基本大纲 - 我的代码出现语法错误。因此使用 ADODB 更加熟悉。
  • 您可能缺少一些导入(即:system.data、system.data.sqlclient)。
【解决方案2】:

您可以按如下方式更新您的表格:

语法: MSDN

Update YourTable
Set Column = Value
Where Condition

cmdInsert.CommandText = "Update ExchangeTypes Set MarketSelectionId =  VALUE 
Where MarketSelectionId = '?' ";

【讨论】:

  • 谢谢萨米。我让它工作了,这是向前迈出的一大步。但是,看起来我在选择连接方面缺乏经验,我需要更改为更现代的选择。
猜你喜欢
  • 2011-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多