大家好,我是刚开始学习ASP.NET写数据库网站的新手我用Access新建了一个MDB数据库,数据库里面只有一个表,名为UsersUsers表里面包含三个字段:
ID:        自动编号(设为主键)
Username:   文本类型
Password:   文本类型然后尝试在Visual Studio 2010中以VB.NET程序在表Users中插入一新行但当程序代码执行到 Command.ExecuteNonQuery时报错
错误描述为:   INSERT INTO 语法错误程序代码如下,烦请各位帮忙分析并解决一下,谢谢!Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim dbName As String
    Dim StrConnection As String
    Dim Sql As String
    Dim Conn As OleDbConnection
    Dim Command As OleDbCommand    dbName = ConfigurationManager.AppSettings("dbPath")
    StrConnection = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath(dbName)
    Conn = New OleDbConnection(StrConnection)
    Conn.Open()    Sql = "INSERT INTO Users (username,password) VALUES (@username,@password)"
    Command = New OleDbCommand(Sql, Conn)    Command.Parameters.AddWithValue("@username", txtUsername.Text)
    Command.Parameters.AddWithValue("@password", txtPassword.Text)    Command.ExecuteNonQuery()    Command.Dispose()
    Command = Nothing
    Conn.Close()
    Conn = Nothing
    StrConnection = Nothing
    Sql = Nothing
End Sub

解决方案 »

  1.   

    INSERT INTO Users(username,password) VALUES(@username,@password)"
      

  2.   

    没有看出来,请楼下解决个人建议,
    INSERT INTO Users (username,password) VALUES (@username,@password) 用
    INSERT INTO Users (username,password) VALUES ('+txtUserName.text+','+txtPassword.Text+')来代替
    初学者不必用的那么花哨还传参,直接弄个简单的sql语句执行下就行了
      

  3.   

    或者这么写试试
    Command.Parameters.AddWithValue(new SqlParameter("@password", txtPassword.Text))
      

  4.   

    楼主的表结构中是否定义的username和password不能为空,负责用string.Empty()过滤。三楼的说法很搞笑,SQL中“@”传参的写法绝对不是花哨,而是为了代码的安全性,为了防止注入是数据库攻击。初学者养成良好的coding习惯是很有必要的。
      

  5.   

    Sql = "INSERT INTO Users ([username],[password]) VALUES (@username,@password)"
      

  6.   

    谢谢大家,用了6楼jrl5365(king007)的代码后,Sql = "INSERT INTO Users ([username],[password]) VALUES (@username,@password)"没有报错了,数据库也成功插入新行了,但是插入的字段值却不是期望的传参内容,而是直接字入了参数名称字符串"@username"和"@password",即我的txtUsername.Text = "a"
    txtPassword.Text = "b"期待数据库也写入"a"和"b",但实际上却直接写入了 "@username"和"@passowrd",为什么这样呢?应该怎么解决?
      

  7.   

    我也遇到过这种问题,网上搜了下这样写应该是可以的
    INSERT INTO Users (username,password) VALUES('"+txtUserName.text+"','"+txtPassword.Text+"')
      

  8.   


    无意说什么,只是初学者连sql语句写的还不标准的要求什么用传参的方式,其实我觉得lz如果用sql拼出来绝对不会出现这个问题。
    当然5楼说的很有道理,传参是比拼sql安全了很多,但是请不要误导初学者,难道为了好的coding习惯,导致一个问题nnnnn久也解决不了?  无论什么都要相对而言。
      

  9.   

    问题解决了,解决的方法其实还是用了6楼jrl5365(king007)的代码,Sql = "INSERT INTO Users ([username],[password]) VALUES (@username,@password)"之前出现直接写入@username和@password的原因是我不知道什么时候把代码修改成Sql = "INSERT INTO Users ([username],[password]) VALUES ('@username','@password')"所以传参不起作用了,这是我自己的疏忽!同时也很感谢楼上各位的帮助,特别是hebeijg(一个人努力),你很热心,谢谢你。
      

  10.   

    我跟你类似的程序~~但报错在下面三句上:
            OleDbCommand.Parameters.AddWithValue("@username", Tbuser.Text);
            OleDbCommand.Parameters.AddWithValue("@password", Tbcode.Text);
            OleDbCommand.Parameters.AddWithValue("@mailbox", Tbmailbox.Text);编译器错误信息:   CS0120:   非静态的字段、方法或属性“System.Data.OleDb.OleDbCommand.Parameters.get”要求对象引用 
    是不是要输入system引用的?