【问题标题】:C# & SQL Server - insert into different tables (if/case statement)C# & SQL Server - 插入不同的表(if/case 语句)
【发布时间】:2015-12-23 22:06:08
【问题描述】:

我有符号列表及其插入MYTABLE 的数据。我希望如果SYMBOL = 'ABC',数据将插入MYTABLE_ABC,如果SYMBOL = 'DCE',它将插入MYTABLE_DCE等...

我正在使用 SQL Server。考虑 IF/CASE 语句?但无法弄清楚 C# 控制台应用程序中的语法。

Public String toInsert()
{
    String output = "insert into MYTABLE (id,symbol,date,time, value,type) values ( " + id + ",'" + symbol + "', ('" + date +"'), ('" + time + "')," + value + ",'" + type + "')";
    return output;
}

【问题讨论】:

  • 在此处插入强制性“不要使用字符串连接生成 SQL 语句”注释。
  • 您可以 86 位“字符串输出”,然后执行“返回”“插入 ...”。再说一次,为什么不直接分配该内联,而不是从中创建一个方法?跨度>
  • @SixtySeven 您需要在您的情况下使用参数化查询,这将更易于管理并且可读性也会更好..如果您想要基于ABC || DCE 进行条件插入,那么您需要重新考虑您的插入方法
  • 为什么会有两个具有相同架构的表? symbol 在您的示例中已经是一列,只需在该列上插入或查询,而不是使用两个表。
  • @MichaelMcGriff 我不太可能拥有 1 代表并且今天刚刚创建帐户的用户能够理解您评论的含义(当然我知道您指的是什么)。

标签: c# sql sql-server insert-into


【解决方案1】:

为什么不把表名写成变量呢?你可以对字符串做任何你喜欢的事情,因为它是一个字符串,而不是一个函数或其他东西。

喜欢:

String Table_Name;
switch (symbol)
{
    case "ABC": Table_Name = "MYTABLE_ABC";
    case "DEF": Table_Name = "MYTABLE_DEF";
(blabla....)
}
String output = "insert into " +Table_Name+ " (id,symbol,date,time, value,type) values ( " + id + ",'" + symbol + "', ('" + date +"'), ('" + time + "')," + value + ",'" + type + "')";

            return output;

【讨论】:

  • 很好的例子,但我会向 OP 建议他们应该使用参数构建查询也将提高可读性并防止任何潜在的Sql Injection
  • 李嘉宁 很好的解决方案! @MethodMan tnx 表示您的观点,尽管如果您可以编写一个示例/结构来说明您将如何使用参数来编写它,那将会更有帮助,-)
【解决方案2】:

怎么样...

public String toInsert()
{
  if (symbol == "ABC")
    return "insert into MYTABLE_ABC (id,symbol,date,time, value,type) values ( " + id + ",'" + symbol + "', ('" + date +"'), ('" + time + "')," + value + ",'" + type + "')";
  else
  if (symbol == "DEF")
    return "insert into MYTABLE_DEF (id,symbol,date,time, value,type) values ( " + id + ",'" + symbol + "', ('" + date +"'), ('" + time + "')," + value + ",'" + type + "')";
  else
    return null;
}

【讨论】:

  • 您甚至可以通过使用临时变量作为表名来简化它,就像您使用 id、日期、时间......然后您只需要编写一次查询
  • 这几乎是正确的,如果您的 OP 想知道 INSERT 是否成功,那么该方法应该返回一个布尔值而不是字符串,为什么当您和 OP 从未显示时返回插入语句正在执行查询的位置..
  • @MethodMan 我只是回答了这个问题:)
  • @MethodMan 这是你的意见,我尊重这一点,但像“不要使用串联”这样的答案对原始海报毫无帮助。
  • @MethodMan 您对这个问题的回答对我来说听起来有点消极。您不喜欢这个问题的任何答案,但您还没有提供自己的答案并描述使用参数化查询的好处。有人也对所有答案投了反对票,如果是你,我不会感到惊讶。如果您花时间回答这个问题,那真的会更有建设性。
【解决方案3】:

使用String.Format() 方法并进行字符串连接。

您可以在创建插入语句字符串时将值symbol 附加到"MYTABLE_"。如果symbol 的每个值都遵循相同的模式,那么这将起作用。如果您希望更灵活地识别未知符号值或根据symbol 的值以不同的方式格式化表名,那么使用switch 语句可能是可行的方法。

public String toInsert()
{
    String output = String.Format("insert into MYTABLE_{0} (id,symbol,date,time, value,type) values ( '{1}', ('{2}'), ('{3}'), {4}, '{5}', {6} )", symbol, id, symbol, date, time, value, type);

    return output;
}

public String toInsert()
{
    String tableName;

    switch (symbol)
    {
        case "ABC":
        case "XYZ":
        case "B2M":
            tableName="MYTABLE_" + symbol;
            break;
        case "A12":
            tableName="MYTABLE_TEST";
            break;
        case string.Empty:
        case NULL:
            tableName="MYTABLE";
            break;
        default:
            // as an example the default case could throw an error if you don't want to process unknown symbols. Or you could use a different tableName format pattern
            // throw new Exception("Unknown value of symbol variable ({0}", symbol);
            tableName = "MYTABLE_UnknownSymbol_"+symbol;
            break;
    }

    String output = String.Format("insert into {0} (id,symbol,date,time, value,type) values ( '{1}', ('{2}'), ('{3}'), {4}, '{5}', {6} )", myTableName, id, symbol, date, time, value, type);

    return output;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-10
    • 1970-01-01
    • 1970-01-01
    • 2016-07-08
    • 1970-01-01
    相关资源
    最近更新 更多