-1

これらの数値のセットを一重引用符で囲むと、プログラムでエラーが発生します

string sql1 = "( 11111111111111, 222222222222 )";

文字列変数に変換し、その変数を SQL ステートメントで使用します。

を使用していAND COLUMN_NAME IN ( '" + sql1 + "' )ます。

次のエラーが表示されます。

SQL 例外がユーザー コードによって処理されませんでした: '11111111' 付近の構文が正しくないか、'(' 付近の構文が正しくありません。

そのクエリを SQL アダプターで使用し、Fill コマンドを使用して DataTable に入力します。

文字列変数の代わりにmethod を使用して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

"コードのこの部分で1つ見逃していると思います:

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+" )";

SqlInjectionからあなたを救うだけでなく、これらの問題を取り除くSqlParameterを使用する必要があります。

また、最初の条件は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 に答える