2016-06-01 2 views
-1

私はこれを行う方法を見つけようと非常に苦労しています。テキストボックスからの入力を許可すると、管理者はArchive_Decade_Tblのデータを更新し、写真を追加することを選択した場合はArchive_Image_Tblに行を挿入できます。私は更新クエリが動作しているが、私は私の人生のために挿入作業を取得することはできません。私は非常に新しいので、私のコードはおそらくあなたのほとんどにうんざりに見えるだろうと意識して、私は現時点でのセキュリティを心配していないので、私はSQL注入の脆弱性を知っているしかし助けてください挿入クエリを機能させるには、書式設定のヘルプが必要です

ここにあります更新機能のためのコード:今

 protected void update_Clicked(object sender, EventArgs e){ 

     string connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + Server.MapPath("~\\database\\ARCHIVE_MASTER_DATABASE.accdb") + "; Persist Security Info=False;"; 
     DataSet infoDs = new DataSet(); 
     OleDbDataAdapter OleDbAdapter; 
     classMe.Attributes.Add("class", "productInfoContainerNoFloat"); 
     string cmd1 = @"Select * From ARCHIVE_DECADE_TBL WHERE [email protected]"; 
     string cmd2 = @"Select * From ARCHIVE_IMAGE_TBL WHERE [email protected]"; 
     OleDbConnection dbConn = new OleDbConnection(connectionString); 
     try 
    { 
     dbConn.Open(); 
     OleDbAdapter = new OleDbDataAdapter(cmd1, dbConn); 
     OleDbAdapter.SelectCommand.Parameters.Add("@buttonClicked", OleDbType.Integer).Value = archiveIdNumber.InnerText.Substring(33); 
     OleDbAdapter.Fill(infoDs, "First Table"); 
     OleDbAdapter.SelectCommand.CommandText = cmd2; 
     OleDbAdapter.Fill(infoDs, "Second Table"); 
     OleDbAdapter.Dispose(); 

     string cmdString = "Update ARCHIVE_DECADE_TBL Set PRODUCT_NAME='" + Request.Form["nameBox"] + "', MODEL_NUMBER='" + Request.Form["modelBox"] + "', YEAR_INTRODUCED='" + Request.Form["startBox"] + "', YEAR_DISCONTINUED='" + Request.Form["endBox"] + "', PRODUCT_LINE='" + Request.Form["lineBox"] + "', LOCATION='" + Request.Form["locationBox"] + "', QUANTITY='" + int.Parse(Request.Form["quantityBox"]) + "' " + 
      "Where ARCHIVE_ID_NUMBER=" + int.Parse(Request.Form["archiveBox"]); 

     OleDbAdapter.UpdateCommand = new OleDbCommand(cmdString, dbConn); 
     OleDbAdapter.UpdateCommand.ExecuteNonQuery(); 
     dbConn.Close(); 
     if (addPhotos.HasFiles) 
     { 
      //cmdString = "Update ARCHIVE_DECADE_TBL Set PRODUCT_NAME='" + Request.Form["nameBox"] + "', MODEL_NUMBER='" + Request.Form["modelBox"] + "', YEAR_INTRODUCED='" + Request.Form["startBox"] + "', YEAR_DISCONTINUED='" + Request.Form["endBox"] + "', PRODUCT_LINE='" + Request.Form["lineBox"] + "', LOCATION='" + Request.Form["locationBox"] + "' " + 
      //"Where ARCHIVE_ID_NUMBER=" + int.Parse(Request.Form["archiveBox"]); 
      var x = 0; 
      if (!System.IO.Directory.Exists(Server.MapPath("includes/images/archives/" + Request.Form["archiveBox"] + "_1"))) 
      { 
       System.IO.Directory.CreateDirectory(Server.MapPath("includes/images/archives/" + Request.Form["archiveBox"] + "_1")); 
      } 

      String filePath = Server.MapPath("includes/images/archives/" + Request.Form["archiveBox"] + "_1"); 
      HttpFileCollection uploadedFiles = Request.Files; 

      for (int i = 0; i < uploadedFiles.Count; i++) 
      { 
       HttpPostedFile userPostedFile = uploadedFiles[i]; 
       if (userPostedFile.ContentLength > 0) 
       { 
        string extension = Path.GetExtension(userPostedFile.FileName); 
        //Request.Form["archiveBox"] + "_" + i will be the same as the "IMAGE" column in the IMAGE_TBL 
        uploadedFiles[i].SaveAs(filePath + "/" + Request.Form["archiveBox"] + "_" + (i + 1) + extension); 

       } 
       x++; 
      } 
      OleDbConnection dbConn2 = new OleDbConnection(connectionString); 
      OleDbDataAdapter OleDbAdapter2; 
      DataSet infoDs2 = new DataSet(); 
      try 
      { 
       dbConn2.Open(); 
       OleDbAdapter2 = new OleDbDataAdapter(cmd1, dbConn); 

       string cmdString2 = "INSERT INTO ARCHIVE_IMAGE_TBL (ARCHIVE_ID_NUMBER, MODEL_NUMBER, LOCATION, IMAGE, NUMBER_OF_IMAGES, IMAGE_FILE_TYPE) VALUES ('" + Request.Form["archiveBox"].ToString() + "', '" + Request.Form["modelBox"].ToString() + "', '" + Request.Form["locationBox"].ToString() + "', '" + Request.Form["archiveBox"].ToString() + "_1" + "', '" + uploadedFiles.Count.ToString() + "', 'jpg');"; 
       testLbl.InnerText = cmdString2; 
       OleDbAdapter2.InsertCommand = new OleDbCommand(cmdString2, dbConn2); 

       OleDbAdapter2.InsertCommand.ExecuteNonQuery(); 
      } 
      catch (Exception ex) 
      { 

      } 
     } 

    } 
     catch (Exception ex) 
     { 
     } 
    } 

私はラベル、コピー/貼り付けに文字列を印刷しているため、私は取得していますすべてが構文エラーが私のINSERT INTO文であるということですが、私はなぜ知りませんそれはアクセスに入り、それは私が望むものを正確にした

+0

正確な構文エラー – logixologist

+0

ヒント:適切なソフトウェア(MySQL、Oracle、DB2、...)とバージョンの両方でデータベース質問にタグを付けると便利です。 'sql-server-2014'です。構文と機能の相違は、しばしば答えに影響します。 – HABO

答えて

1

構文エラーは、IMAGEという名前の列によって発生します。これはMS-Accessの予約語です。コードにを使用する場合は、その名前を大括弧で囲む必要があります。

がだからあなたの挿入クエリの開始は

string cmdString2 = @"INSERT INTO ARCHIVE_IMAGE_TBL (ARCHIVE_ID_NUMBER, 
    MODEL_NUMBER, LOCATION, [IMAGE], NUMBER_OF_IMAGES, IMAGE_FILE_TYPE) 
    VALUES (.......)"; 

として書かれるべきであるとして、あなただけの可能な構文のシーケンスの開始時にある、ので、パラメータ化クエリに即座に切り替えを検討してください、と言いました暗黙の変換と解析の問題によって引き起こされるエラー。 SQLインジェクションハック

だから例えば

string cmdString2 = @"INSERT INTO ARCHIVE_IMAGE_TBL (ARCHIVE_ID_NUMBER, 
    MODEL_NUMBER, LOCATION, [IMAGE], NUMBER_OF_IMAGES, IMAGE_FILE_TYPE) 
    VALUES (@id, @num, @loc, @img, @imgnum, 'jpg')"; 
OleDbCommand cmd = new OleDbCommand(cmdString2, con1); 
cmd.Parameters.Add("@id", OleDbType.VarWChar).Value = Request.Form["archiveBox"].ToString(); 
... and so on for the other parameters placeholders 
cmd.ExecuteNonQuery(); 

は、あなたのパラメータの正しいデータ型を使用することを忘れないでください。列に整数が必要な場合は、OleDbType.Integerのパラメータを作成し、値を整数に設定します。日付と浮動小数点数も同じです。

ところで、コマンドを実行するには、OleDbDataAdapterを持つ必要はありません。

+1

ありがとうございました。それらの2つの小括弧は私を電車の前で飛びたいと思った。私は再びそれを列名として使用しません –

0

dbConn2ここでは、 atement?

... 
dbConn2.Open(); 
OleDbAdapter2 = new OleDbDataAdapter(cmd1, dbConn); // <-- here 

string cmdString2 = "INSERT INTO ARCHIVE_IMAGE_TBL (ARCHIVE_ID_NUMBER, MODEL_NUMBER, LOCATION, IMAGE, NUMBER_OF_IMAGES, IMAGE_FILE_TYPE) VALUES ('" + Request.Form["archiveBox"].ToString() + "', '" + Request.Form["modelBox"].ToString() + "', '" + Request.Form["locationBox"].ToString() + "', '" + Request.Form["archiveBox"].ToString() + "_1" + "', '" + uploadedFiles.Count.ToString() + "', 'jpg');"; 
... 

また、あなたはそれについて言及していますが、SQLインジェクションのリスクを排除するためにパラメータを使用してください。また、使い捨てのクラス(接続、コマンドなど)を処分したい。

関連する問題