0

ここにあるものよりも多くの列がありますが、主キー列 TrackingID (nchar[10]) をテストとして投稿しようとしているだけです。それを機能させることができれば、取得できます残りは仕事に。私は、同様のクエリを作成して完全に実行する Windows フォーム アプリケーションを持っています。それは接続文字列ですか、それともSQLクエリですか? テーブル名は Full です。合計 23 の列がありますが、唯一の主キーはトラッキング ID であり、null にすることはできません。いずれの場合も、これらのクエリは OnClick ボタン イベントです。ご覧のとおり、いくつかのルートを試しました。SQLインジェクションを防ぐために、これをパラメータ化するように設定したいと考えています。最初に表示されるコードは、(脆弱ではありますが) 一貫して動作する C# の Windows フォーム アプリケーションからのものです。以下に、asp.net コードが表示されます。

    private void licensesubmitbutton_Click(object sender, EventArgs e)
    {
        try
        {
            System.Data.SqlClient.SqlConnection sqlConnection1 =
    new System.Data.SqlClient.SqlConnection("Data Source=data99;Initial Catalog=LicenseInventoryMgr;Integrated Security=True;Connect Timeout=0;Trusted_Connection=Yes");

            System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand();
            cmd.CommandType = System.Data.CommandType.Text;
            cmd.CommandText = "INSERT LIMTable (Software,Host,AssetTag,ActivationDate,LicenseNumber) VALUES ('" + softwarecombobox.Text + "','" + hostnamebox.Text + "','" + assettagcombobox.Text + "','" + dateactivateddatetimepicker.Value.ToString("yyyy-MM-dd") + "','" + licensekeytextbox.Text + "')";
            cmd.Connection = sqlConnection1;

            sqlConnection1.Open();
            cmd.ExecuteNonQuery();
            sqlConnection1.Close();
            MessageBox.Show("Successfully Submitted!");
        }
        catch (System.Exception )
        {
            MessageBox.Show("Submission unsuccessful. Try saving and refreshing first!");
        }
    }

そして、これが私が試した ASP.NET コードです。

    protected void submit_Click(object sender, EventArgs e)
    {
        try
        {
            SqlConnection conn = new SqlConnection(@"Data Source=data99;Initial Catalog=LFM_Archive;Integrated Security=True");
            string sql = "INSERT INTO Full (TrackingID) values (@TrackingID)";
            conn.Open();
            SqlCommand cmd = new SqlCommand(sql, conn);
            cmd.Parameters.Add("@TrackingID", SqlDbType.NChar);
            cmd.Parameters["@TrackingID"].Value = 6789;
            cmd.ExecuteNonQuery();
            conn.Close();

            MailMessage m1 = new MailMessage("y@x.net", "x@x.net");
            m1.Subject = "SQL Query Success";
            m1.Body = "SQL Query Success :)";
            m1.IsBodyHtml = true;
            SmtpClient smtp = new SmtpClient();
            smtp.Host = "mailserver99";
            smtp.EnableSsl = false;
            //System.Net.NetworkCredential NetworkCred = new System.Net.NetworkCredential();
            //NetworkCred.UserName = "username";
            //NetworkCred.Password = "password";
            smtp.UseDefaultCredentials = true;
            //smtp.Credentials = NetworkCred;
            smtp.Port = 25;
            smtp.Send(m1);

        }
        catch
        {
            MailMessage m2 = new MailMessage("y@x.net", "x@x.net");
            m2.Subject = "SQL Query Failed";
            m2.Body = "SQL Query Failed :(";
            m2.IsBodyHtml = false;
            SmtpClient smtp = new SmtpClient();
            smtp.Host = "mailserver99";
            smtp.EnableSsl = false;
            smtp.UseDefaultCredentials = true;
            smtp.Port = 25;
            smtp.Send(m2);
        }
    }

最終結果は、クエリの成功または失敗をフォーム ウィンドウに表示し、フォーム ウィンドウからプルしたり、電子メールを送信したりします。テストする必要がなくなったら、メールはフォームがアーカイブに投稿されたという簡単な通知になります。asp.net アプリケーションのコメント付きコードは、それを試したことを意味するだけであり、機能しない場合は、コメントして新しい方法を試しました。

よく見るために例外メッセージを入れてみることをお勧めしました-それはいくつかの助けになります. submitsuccess.Text は、メッセージが表示される場所です。結果は次のとおりです。「キーワード「Full」付近の構文が正しくありません。」

それはそれがクエリのように聞こえます。「Full」はDB内のテーブル名です。

答え たものは次のとおりです。

            SqlConnection conn = new SqlConnection(@"Data Source=data99;Initial Catalog=LFM_Archive;Integrated Security=True");
            string sql = "INSERT INTO [Full] (TrackingID) values (@TrackingID)";
            conn.Open();
            SqlCommand cmd = new SqlCommand(sql, conn);
            cmd.Parameters.Add("@TrackingID", SqlDbType.NChar, 10);
            cmd.Parameters["@TrackingID"].Value = empfirst.Text;
            cmd.ExecuteNonQuery();
            conn.Close();
4

2 に答える 2

0

問題は、それFULLが SQL の予約語であることです。この Technet リンクを参照してください。

問題を解決するには、次のように予約済みのキーワードに括弧を使用します。

string sql = "INSERT INTO [Full] (TrackingID) values (@TrackingID)";
于 2013-08-15T18:43:04.167 に答える