1

テーブルにデータを挿入しようとしていますが、私が見たコード スニペットは、その人には機能するようですが、私には機能するようです! asp.netのデータベース処理がわからないので、何が間違っているのかわかりません。誰かがコードの何が問題なのか教えてもらえますか?

public partial class CompanyLogin : System.Web.UI.Page
{
protected void Button1_Click(object sender, EventArgs e)
{
    OdbcConnection conn = new OdbcConnection();
    conn.ConnectionString = @".\\SQLEXPRESS;AttachDbFilename=|DataDirectory|\\VCtemps.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True";

    string sql = "insert into company values(@CompName, @BusinessType, @Pword)";
    OdbcCommand cmd = new OdbcCommand(sql);
    string CompName = txtCompName.Text;
    string BusinessType = DropDownList1.Text;
    string Pword = txtPassword.Text;
    cmd.Connection = conn;

    cmd.CommandText = "insert into company(CompName, BusinessType, Pword) Values(@CompName,@BusinessType,@Pword);";
    cmd.Parameters.AddWithValue("@CompName",SqlDbType.VarChar);    
    cmd.Parameters.AddWithValue("@BusinessType",SqlDbType.VarChar);    
    cmd.Parameters.AddWithValue("@Pword",SqlDbType.VarChar);    

cmd.ExecuteNonQuery();

    conn.Close();

    txtCompName.Text = "";
    txtPassword.Text = "";
    DropDownList1.Text = "";
}
}

皆さんのおかげでコードを修正しましたが、実行するか、登録ボタンをクリックすると、次のエラーが表示されます

ExecuteNonQuery には、オープンで使用可能な接続が必要です。接続の現在の状態は閉じています

4

7 に答える 7

4

クエリを調整できます-by deleting values

 cmd.CommandText = "insert into company(CompName, BusinessType, Pword) values('"+ CompName + "','"+ BusinessType + "','" + Pword + "')

注意:私も使用することをお勧めしますSqlCommand.Parameters.AddWithValue method

そして、このコードを追加します:

    cmd.CommandText =  "insert into company(CompName, BusinessType, Pword) Values(@CompName,@BusinessType,@Pword);"

    cmd.Parameters.AddWithValue("@CompName",);    
    cmd.Parameters.AddWithValue("@BusinessType",);    
    cmd.Parameters.AddWithValue("@Pword",);    

    cmd.ExecuteNonQuery();
于 2012-10-11T14:14:55.303 に答える
1

以下を変更してみてください。

conn.ConnectionString = "Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\VCtemps.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True";

に:

conn.ConnectionString = "Data Source=.\\SQLEXPRESS;AttachDbFilename=|DataDirectory|\\VCtemps.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True";

と:

cmd.CommandText = "insert into company values(CompName, BusinessType, Pword) values('"+ CompName + "','"+ BusinessType + "','" + Pword + "')

に:

cmd.CommandText = "insert into company values(CompName, BusinessType, Pword) values('"+ CompName + "','"+ BusinessType + "','" + Pword + "')";

追加:

パラメータ化されたクエリを使用する必要があります。SQLインジェクション攻撃に対して脆弱になるため、ユーザー入力をSQLステートメントに直接渡さないでください。

string commandText = "insert into company values(CompName, BusinessType, Pword) values(@CompName, @BusinessType, @Pword)";
SqlCommand command = new SqlCommand(commandText, connection);

command.Parameters.Add("@CompName", SqlDbType.VarChar);
command.Parameters.Add("@BusinessType", SqlDbType.VarChar);
command.Parameters.Add("@PWord", SqlDbType.VarChar);
于 2012-10-11T14:15:32.200 に答える
0

cmd.CommandText = "会社の値に挿入(CompName、BusinessType、Pword)values('" + CompName + "'、'" + BusinessType + "'、'" + Pword + "'");

これを試して....

于 2012-10-11T14:14:49.523 に答える
0

cmd.CommandText引用符のエラーがないかで始まる行を確認してください。

代わりに、次のString.Formatような方法を使用してみてください。

 cmd.CommandText = String.Format("insert into company values(CompName, BusinessType, Pword) values('{0}','{1}','{2}')",CompName,BusinessType,Pword);

これは、変数の連結をはるかに簡単に追跡するのに役立ちます。

于 2012-10-11T14:16:07.517 に答える
0

以下のサンプルを確認してください。また、接続とコマンドを内部にラップしますusing clause

  string yourConnectionString="";
    int result=0;
    using(OdbcConnection conn = new OdbcConnection(yourConnectionString))
    {

         string sql = "insert into company values(@CompName, @BusinessType, @Pword)";
         using (OdbcCommand cmd=new OdbcCommand(sql,conn))
         {   
            cmd.Parameters.AddWithValue("@CompName",txtCompName.Text);
            cmd.Parameters.AddWithValue("@BusinessType",DropDownList1.SelectedValue);  
            cmd.Parameters.AddWithValue("@Pword ",txtPassword.Text);  
            conn.Open();
            result=cmd.ExecuteNonQuery();
         }
         conn.Close();
         if(result >0)
         {
           txtCompName.Text = "";
           txtPassword.Text = "";
           DropDownList1.SeletedIndex = -1;
         }    
    }
于 2012-10-12T15:26:31.900 に答える
0
  1. 将来のコードでは、SQL コマンドでパラメーターを使用します!! を参照してください。
  2. 文字列全体の前に @ を付けるか、エスケープする必要がある記号の前に '\' を付けて、接続文字列をエスケープします。
  3. cmd.CommandText = "insert into company values(CompName, BusinessType, Pword) values('"+ CompName + "','"+ BusinessType + "','" + Pword + "')最後に欠け";ています。
  4. string sql = "insert into company values(@CompName, @BusinessType, @Pword)"; OdbcCommand cmd = new OdbcCommand(sql);

    cmd.CommandText = "insert into company values(CompName, BusinessType, Pword) values('"+ CompName + "','"+ BusinessType + "','" + Pword + "')
    どちらもCommandText を設定 しているため、削除sql して変更
    OdbcCommand cmd = new OdbcCommand(sql);することができますOdbcCommand cmd = new OdbcCommand();
于 2012-10-11T14:21:37.447 に答える
0
  1. 接続が開かれませんでした
  2. sqlパラメーター化されたクエリの不要な文字列
  3. クエリの構文エラー (CommandText)

.

protected void Button1_Click(object sender, EventArgs e)
{
    OdbcConnection conn = new OdbcConnection();
    conn.ConnectionString = "Data Source=.\SQLEXPRESS;
                       AttachDbFilename=|DataDirectory|\VCtemps.mdf;Integrated 
                       Security=True;Connect Timeout=30;User Instance=True";

    OdbcCommand cmd = new OdbcCommand();
    string CompName = txtCompName.Text;
    string BusinessType = DropDownList1.Text;
    string Pword = txtPassword.Text;

    conn.Open();
    cmd.Connection = conn;

    cmd.CommandText = "insert into company (CompName, BusinessType, Pword) 
                values('"+ CompName + "','"+ BusinessType + "','" + Pword + "')";

    cmd.ExecuteNonQuery();

    conn.Close();

    txtCompName.Text = "";
    txtPassword.Text = "";
    DropDownList1.Text = "";
}
于 2012-10-11T14:29:32.363 に答える