怎么写:插入表ALL除了X,if语句

时间:2011-10-13 18:54:17

标签: c# asp.net sql if-statement

关于这个社区的所有时间的第二个问题!我是一个菜鸟,我的弱点是if语句或amoungst循环和其他if语句。

所以这是我的情景。此方法将任何内容插入数据库,但我想验证某些内容。我不想在数据库中添加任何内容,而是希望输入的内容以“LIFT”开头,我希望方法跳过该行并继续下一行。有没有办法可以将其编入此方法?或者我需要编写一个新方法?非常感谢!

      public bool BatchInsert(string table, string[] values)
{
    string statement = "INSERT INTO " + table + " VALUES(";
    for (var i = 0; i < values.Length - 1; i++)
    {
        if(values[i].Contains("'")){
            values[i] = values[i].Replace("'", "''");
        }
        statement += "'"+values[i]+"', ";
    }
    statement += "'" + values[values.Length - 1] + "');";

    SqlCommand comm = new SqlCommand(statement, connectionPCICUSTOM);
    try
    {
        comm.Connection.Open();
        comm.ExecuteNonQuery();
    }
    catch (Exception e)
    {
        KaplanFTP.errorMsg = "Database error: " + e.Message;
    }
    finally
    {
        comm.Connection.Close();
    }

    return true;

}

2 个答案:

答案 0 :(得分:1)

一些提示。不要+ =字符串类型,因为它会降低性能。我也更喜欢foreach循环,因为代码更清晰,更容易阅读/更不容易搞乱索引。同时使用using语句确保正确处理。

假设您有对System.Linq的引用,您可以使用以下内容。我没有测试它,但它应该工作:

public bool BatchInsert(string table, IEnumerable<string> values)
    {
        var sql = new StringBuilder();
        sql.Append("INSERT INTO " + table + " VALUES(");

        var newValues = values.Where(x => !x.StartsWith("LIFT")).Select(x => string.Format("'{0}'", x.Replace("'", "''")));
        sql.Append(string.Join("","", newValues.ToArray()));
        sql.Append(")");

        using (var comm = new SqlCommand(statement, connectionPCICUSTOM))
        {
            try
            {
                comm.Connection.Open();
                comm.ExecuteNonQuery();
            }
            catch (Exception e)
            {
                KaplanFTP.errorMsg = "Database error: " + e.Message;
            }
            finally
            {
                comm.Connection.Close();
            }
        }
        return true;
    }

答案 1 :(得分:0)

如果您的目标是遍历“值”集合,保留以“lift”开头的值及其对应的列不变,则可能需要修改构建INSERT查询的方式。您将根据需要添加列,而不是假设将考虑每个值。基本上,您需要使用以下表单:

INSERT INTO tablename (col1, col2...) VALUES (val1, val2...)

例如:

string statement = "INSERT INTO tablename ";
string columns = "(";
string values = "(";
for (var i = 0; i < values.Length - 1; i++)
{
     //if values doesn't contain lift, add it to the statement
     if(!values[i].contains("LIFT")){
          //columnName is a collection of your db column names
          columns += "'"+columnName[i]+"'";
          values += "'"+values[i]+"'";
     }
 }
 columns += ")";
 values += ")";
 statement += columns +" VALUES " + values;

正如一些评论所述,这种方法可以让您进行SQL注入。谨慎使用。

编辑:抱歉,我错过了你说'以'LIFT'开头'的地方。将.contains()行修改为以下内容:

if(!values[i].StartsWith("LIFT")){