当前位置:编程学习 > C#/ASP.NET >>

报SQL语句出错,但我就是没看出来哪里错了,帮我看看吧!

在命名空间:win1中有一段如下程序
......
private void add_Click(object sender, System.EventArgs e)
{

   fo2=new win2();
   fo2.ShowDialog();
if(fo2.jilu==0)
{
try
{

this.constr.Open();
OleDbCommand com2=new OleDbCommand(fo2.str,constr);
        com2.ExecuteNonQuery();
this.constr.Close();
shuaxin();}
catch(OleDbException e4)
{
this.constr.Close ( ) ;
MessageBox.Show("你没有增加任何数据!"+e4.ToString());
}
}

}
......

第二段(同一个命名空间中的不同窗本):
private void add_Click(object sender, System.EventArgs e)
{
a=this.tbdep.Text;
b= this.nametb.Text;
c=this.iptb.Text;
d=this.infoli.Text;
if(b==""||c==""||d==""||a=="")
{MessageBox.Show("请检查,数据没填完整!");}
else
{
str="INSERT INTO wcb(dep,names,ip,info)VALUES('"+a+"','"+b+"','"+c+"','"+d+"')";
MessageBox.Show("增加数据成功!"+str.ToString());}
jilu=0;
}
...
现在用的ACCESS数据库,报说我的SQL有语法错误!
我用SQL2000就没得这个问题,而且是同样的程序!
--------------------编程问答-------------------- 是不是+" ' 这个中间有空格的原因?

改一下,去掉空格

 str = "INSERT INTO wcb(dep,names,ip,info)VALUES( '" + a + "', '" + b + "', '" + c + "', '" + d + "')"; 
--------------------编程问答-------------------- 试一试这么写:
private void add_Click(object sender, System.EventArgs e) 

a=this.tbdep.Text.Replace("'","''"); 
b= this.nametb.Text.Replace("'","''"); 
c=this.iptb.Text.Replace("'","''"); 
d=this.infoli.Text.Replace("'","''"); 
if(b=="" ¦ ¦c=="" ¦ ¦d=="" ¦ ¦a=="") 
{MessageBox.Show("请检查,数据没填完整!");} 
else 

str="INSERT INTO wcb(dep,names,ip,info) VALUES ( '"+a+" ', '"+b+" ', '"+c+" ', '"+d+" ')"; 
MessageBox.Show("增加数据成功!"+str.ToString());} 
jilu=0; 

--------------------编程问答-------------------- 是不是用了什么关键字做字段名,或者是标点用的中文输入法输入的,我以前就写错过 --------------------编程问答-------------------- 建议使用参数化的方法,不要再拼SQL了,一个容易错,另外一个在数据库不同时还需要从写SQL代码. --------------------编程问答-------------------- 上面几位的方法都试过了,但还是没解决到问题!
--------------------编程问答-------------------- --------------------编程问答-------------------- 错误信息是:
System.Data.OleDb.OleDbException:Insert into 语句的语法错误.
at System.Data.OleDb.Command.ExecteCommandTextErrorHanding(Int 32 hr)
at System.Data.OleDb.Command.ExecteCommandTextForSingleResult(tagDBPARAMS dbParams,Object& executeResult)
at System.Data.OleDb.Command.ExecteCommandText.....
--------------------编程问答-------------------- 是否是表字段类型不匹配,或字段个数不对,或者插入字串长度过长。 --------------------编程问答-------------------- sqlserver2000和Access数据库的语法格式,有些是不一样的,比如,你在sqlserver2000里可以insert 一个int型字段用引号insert tables (aa) values ('9'),但是在access中可能不能要引号。
你可以在access中建立一个sql查询,类似sqlserver2000的查询分析器,来帮助你分析sql语法错误! --------------------编程问答-------------------- private void add_Click(object sender, System.EventArgs e)  
{  
a=this.tbdep.Text.Replace(" '"," ' '");  
b= this.nametb.Text.Replace(" '"," ' '");  
c=this.iptb.Text.Replace(" '"," ' '");  
d=this.infoli.Text.Replace(" '"," ' '");  
if(b=="" ¦ ¦c=="" ¦ ¦d=="" ¦ ¦a=="")  
{MessageBox.Show("请检查,数据没填完整!!");}  
else  
{  
str= "INSERT INTO wcb(dep,names,ip,info)VALUES( '" + a + "', '" + b + "', '" + c + "', '" + d + "')"; 
MessageBox.Show("增加数据成功!"+str.ToString());}  
jilu=0;  
}

应当就好用了试一试!   --------------------编程问答-------------------- str= "INSERT INTO wcb(dep,names,ip,info)VALUES(  '" + a + " ',  '" + b + " ',  '" + c + " ',  '" + d + " ')";  


 '" + a + " '   右边是不是多了一个空格? --------------------编程问答-------------------- 设个断点试试?把这个sql语句丢到数据库里运行。再看错在哪? --------------------编程问答-------------------- 用sql监视器就能捕捉到了!!
或者用跟踪器! --------------------编程问答-------------------- 数据长度超过了数据库设计所赋予得大小 --------------------编程问答-------------------- OleDbCommand com2=new OleDbCommand("insert into wcb(dep,names,ip,info)values('11','11','11','ll')",constr)
我直接加入SQL语句都不行,还是说语法有错!
可以从数据库中读出数据显示出来,就是没法向其中添加数据\删除和修改数据!
--------------------编程问答-------------------- insert into wcb(dep,names,ip,info)values( '11 ', '11 ', '11 ', 'll ')
到数据库里操作下。 --------------------编程问答-------------------- 我现在用的ACCESS,数据库! --------------------编程问答-------------------- str="INSERT INTO wcb(dep,names,ip,info) VALUES( '"+a+" ', '"+b+" ', '"+c+" ', '"+d+" ')"; 
                                       ^
               ”info)VALUES“我不知你这里有没有空格,还是Copy上来的时候才没有空格,这里应该有空格
如果这样写应该是不会有错的:
str="INSERT INTO wcb(dep,names,ip,info) VALUES( '"+a+"', '"+b+"', '"+c+"', '"+d+"')"; 

--------------------编程问答-------------------- 还是不行哦,我试过了 --------------------编程问答-------------------- --------------------编程问答-------------------- 调试呀,把调试中的语句搞出来放查询分析里跑不就知道了 --------------------编程问答-------------------- 建议你设个断点,然后把得到的sql语句放在查询分析器里看.就知道那里不对了. --------------------编程问答-------------------- 在access里 insert into 要 as 成另一个表
str="INSERT INTO wcb(dep,names,ip,info)VALUES( '"+a+" ', '"+b+" ', '"+c+" ', '"+d+" ') as temp";
就okey了。  --------------------编程问答-------------------- 建立了一个c#和vb的讨论群,欢迎大家加入。欢迎高手!群号:47047449 --------------------编程问答-------------------- 我发现好像很不规范啊。。好多地方没空格。。。。不会是直接COPY的吧。。。无论错误是不是在格式上,先规范了再说。还有。你四个字段都是字符型吗?不过你SQL SERVER没问题。。你试试把'换成"",我记得两个数据库对字符的引号是有区别的。 --------------------编程问答-------------------- 是不是VALUES的问题
SQL 对 插入的直具有自动转换功能 比如 你能在SQL里字段类型为 INT 的列里插入 ‘01’但在ACCESS里是报错误的 --------------------编程问答-------------------- 谢谢大家,我一直再努力!!!
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,