-1

当我将这些数字用单引号括起来时,我的程序导致错误

string sql1 = "( 11111111111111, 222222222222 )";

到一个字符串变量中并在 SQL 语句中使用该变量。

我正在使用AND COLUMN_NAME IN ( '" + sql1 + "' ).

我收到以下错误:

用户代码未处理 SQL 异常:“11111111”附近的语法不正确或“(”附近的语法不正确。

我将在 SQL 适配器中使用该查询并使用 Fill 命令来填充 DataTable。

如果我使用方法DoQuotes而不是字符串变量将单引号替换为 2 个单引号,则不会出错,但生成的 CSV 文件没有数据。

我的程序生成一个 CSV 文件报告。

SQL 代码:AND CARD_NMBR IN ( '" + DoQuotes(sql1) + "' ) ";

哪个是

public static string DoQuotes(string sql)
    {
        if (sql == null)
            return "";
        else
            return sql.Replace("'", "''");
    }

即使我切换到在字符串变量或 SQL 语句本身中删除和添加括号,它也会产生错误。代码:(string sql1 = " '22222222222222', '333333333333333333' ";无括号)

这是我的更多代码。

public DataTable GetData()
{
    var dataTable = new DataTable();

    SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["asccendConnectionString"].ConnectionString);
    conn.Open(); 
    string sql1 = "( '111111111111', '2222222222222' )";
    string query = " select bla bla bla from bla where colum_name = abc AND Card_NBR IN ( '"+sql1+"' );

    SqlCommand cmd = new SqlCommand(query, conn);

    DataTable t1 = new DataTable();
    using (SqlDataAdapter a = new SqlDataAdapter(cmd))
    {
        a.Fill(t1);    //here it errors (see the picture above with link) 
    }
    return t1;
    ///below here is fine, no errors

     protected void btnGenerateReport_Click(object sender, EventArgs e)
{   
    var dataTable = GetData();

    StringBuilder builder = new StringBuilder();
    List<string> columnNames = new List<string>();
    List<string> rows = new List<string>();

    StringBuilder builderColumn = new StringBuilder();

    foreach (DataColumn column in dataTable.Columns)
    {
        columnNames.Add(column.ColumnName);
    }

    builder.Append(string.Join(",", columnNames.ToArray())).Append("\n");

    foreach (DataRow row in dataTable.Rows)
    {
        List<string> currentRow = new List<string>();

        foreach (DataColumn column in dataTable.Columns)
        {
            object item = row[column];

            if (column.Ordinal == 3)
                currentRow.Add("'" + item.ToString());
            else
                currentRow.Add(item.ToString());

           }

        rows.Add(string.Join(",", currentRow.ToArray()));
    }

    builder.Append(string.Join("\n", rows.ToArray()));

    Response.Clear();
    Response.ContentType = "text/csv";
    Response.AddHeader("Content-Disposition", "attachment;filename=ACTIVATION_REPORT.csv");
    Response.Write(builder.ToString());
    Response.End();
}
4

3 回答 3

2

我认为您"在代码的这一部分中错过了一个:

AND Card_NBR IN ( '"+sql1+"' );

这应该是

AND Card_NBR IN ( '"+sql1+"'");

于 2013-05-16T06:15:08.033 回答
1

你有额外的单引号

Card_NBR IN ( '"+sql1+"' );

将其更改为

Card_NBR IN ( "+sql1+" )";

您应该使用SqlParameter,这将使您免于SqlInjection并消除这些问题。

此外,您的第一个条件应该abc用单引号括起来

where colum_name = 'abc'

使用 SqlParameter 它应该是这样的:

using(SqlCommand cmd = new SqlCommand())
{
string query = " select bla bla bla from bla where colum_name = @parameter1 AND Card_NBR IN ( @parameter2)";
cmd.CommandText = query;
cmd.Parameters.AddWithValue("@parameter1", "abc");
cmd.Parameters.AddWithValue("@parameter2", "'22222222222222', '333333333333333333'");
//attach connection... REST of your code
}
于 2013-05-16T06:14:46.127 回答
0

结尾处缺少一个结束引号

string query = " select bla bla bla from bla where colum_name = abc AND Card_NBR IN ( '"+sql1+"' );
于 2013-05-16T06:15:23.717 回答