0
 sqlcom1 = New SqlCommand("INSERT INTO Products VALUES ('" + 
            ds.Tables("Products_Archive").Rows(myval).Item(1) + "','" +  
            ds.Tables("Products_Archive").Rows(myval).Item(2) + "','" + 
            ds.Tables("Products_Archive").Rows(myval).Item(3) + "','" + 
            ds.Tables("Products_Archive").Rows(myval).Item(4) + "','" + 
            ds.Tables("Products").Rows(myval).Item(5) + "','" + 
            ds.Tables("Products_Archive").Rows(myval).Item(6) + "','" + 
            ds.Tables("Products_Archive").Rows(myval).Item(7) + "','" + 
            ds.Tables("Products_Archive").Rows(myval).Item(8) + "','" + 
            ds.Tables("Products_Archive").Rows(myval).Item(9) + "','" + 
            ds.Tables("Products_Archive").Rows(myval).Item(10) + "','" + 
            ds.Tables("Products_Archive").Rows(myval).Item(11) + "','" + 
            ds.Tables("Products_Archive").Rows(myval).Item(12) + "','" + 
            ds.Tables("Products_Archive").Rows(myval).Item(13) + "','" + 
            ds.Tables("Products_Archive").Rows(myval).Item(14) + "', '" + 
            ds.Tables("Products_Archive").Rows(myval).Item(15) + "')", con1)
sqlcom1.ExecuteNonQuery()

これは私のコードです。エラーが発生します

オブジェクト参照がオブジェクト インスタンスに設定されていません。

「利用可能なコードソースがありません...」というメッセージボックスがあります。この問題を解決するにはどうすればよいですか?

4

1 に答える 1

0

SQLインジェクション攻撃を回避し、パフォーマンスを向上させるために、ADO.NET にはパラメーター化されたクエリを常に使用する必要があります。

から値を代入するときは、やみくもに値を代入する前に NULLDataSetをチェックする必要があります!

だから、次のようなことを試してください:

// define your SQL statement - with **PARAMETERS**
// first off: I would recommend to ALWAYS define the columns in the table that you want to insert into
//            to avoid unpleasant surprises (if e.g. a new column is added); of course, use YOUR column
//            names from the "Products" table here! Since you didn't give them - I had to fill in "placeholders"
// secondly: use **PARAMETERS** in your INSERT statement! One for each column you want to insert a value into.
//           Again: you should use "@YourColumnName" for each column in your table - since I don't know
//           those column names - I just made up placeholders. Replace those as needed!
string sqlStmt = "INSERT INTO dbo.Products(Col1, Col2, ..., Col15) " +
                 "VALUES(@v1, @v2, ....., @v15)";

// create SqlConnection and SqlCommand to use                 
using(SqlConnection conn = new SqlConnection("......"))
using(SqlCommand cmd = new SqlCommand(sqlStmt, conn))
{
    // fetch the DataTable you use, and the current row in that table
    DataTable tbl = ds.Tables["Products_Archive"];
    DataRow currentRow = tbl.Rows[myval];

    // define the parameters and set their values    
    cmd.Parameters.AddWithValue("@v1", GetValue(currentRow, 1));
    cmd.Parameters.AddWithValue("@v2", GetValue(currentRow, 2));
    .....
    cmd.Parameters.AddWithValue("@v15", GetValue(currentRow, 15));

    // open connection, execute query, close connection    
    conn.Open();
    cmd.ExecuteNonQuery();
    conn.Close();
}

// method to fetch the value from the row
private object GetValue(DataRow row, int index)
{
    // CHECK FOR NULL ! If the value is NULL - define what you want to have returned.
    if(IsNull(row[index]))
    { 
        // return whatever makes sense to you, if the value in the DataTable's row is NULL
        // here - I chose to return a "database NULL" so that NULL will be inserted into the database
        return DbNull.Value;
    }

    // only if NOT NULL --> then return the actual value in that row's column
    return row[index];
}
于 2013-01-27T09:51:17.300 に答える