这是代码:procedure TForm1.btn1Click(Sender: TObject);
var
str_paras ,str_para :string ;
i ,int_pos :Integer ;
begin
qry1.Close ; qry1.SQL.Clear ;
qry1.SQL.Add('SELECT CRM_Customer_idea.Idea_order_id ,(select customer_name from tss_customer where customer_code = crm_customer_idea.customer_code ) as customer_name FROM CRM_Customer_idea WHERE CRM_Customer_idea.Idea_order_id = :as_billid') ; str_paras := edt1.Text ;
for i:=0 to qry1.Parameters.Count-1 do begin
int_pos :=Pos(';',str_paras);
if int_pos <= 0 then
str_para := str_paras
else
str_para := Copy(str_paras,1,int_pos); qry1.Parameters[i].Value := str_para;
qry1.Parameters[i].Size := Length(str_para) ; str_paras :=Copy(str_paras,int_pos,Length(str_paras)- int_pos);
end ; qry1.Open;end;这是错误:
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 77BA8FC4' in module 'msvcrt.dll' Write of address 012CB000'.
Project Project1.exe raised exception class EOLeException with message '存储空间不足,无法完成此操作.' Process Stopped调试错误产生在 qry1.SQL.Add 这句
并且如果我在这条sql的where字句加() 就没有问题 .如果不带字查询也没有问题请教各位大大,这是什么原因啊?
var
str_paras ,str_para :string ;
i ,int_pos :Integer ;
begin
qry1.Close ; qry1.SQL.Clear ;
qry1.SQL.Add('SELECT CRM_Customer_idea.Idea_order_id ,(select customer_name from tss_customer where customer_code = crm_customer_idea.customer_code ) as customer_name FROM CRM_Customer_idea WHERE CRM_Customer_idea.Idea_order_id = :as_billid') ; str_paras := edt1.Text ;
for i:=0 to qry1.Parameters.Count-1 do begin
int_pos :=Pos(';',str_paras);
if int_pos <= 0 then
str_para := str_paras
else
str_para := Copy(str_paras,1,int_pos); qry1.Parameters[i].Value := str_para;
qry1.Parameters[i].Size := Length(str_para) ; str_paras :=Copy(str_paras,int_pos,Length(str_paras)- int_pos);
end ; qry1.Open;end;这是错误:
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 77BA8FC4' in module 'msvcrt.dll' Write of address 012CB000'.
Project Project1.exe raised exception class EOLeException with message '存储空间不足,无法完成此操作.' Process Stopped调试错误产生在 qry1.SQL.Add 这句
并且如果我在这条sql的where字句加() 就没有问题 .如果不带字查询也没有问题请教各位大大,这是什么原因啊?
解决方案 »
- 编译链接都通过了,但运行就出错,怎么回事?
- 请问怎么可以拿到下载积分啊?想下点东西没分了。
- 请问一个关闭按钮的问题
- 请问高手:为什么我的ReportBuilder在预览时只有一页,但在打印时页数会不停地增加?,不停地打印很多頁?
- 大家来找茬
- 初学pascal,问各位一个问题:对于控制台下的input文件,在什么时候eof能取得真值,怎样操作可以使eof返回true呢?
- RegisterWindowsMessage的使用?
- _RecordSet数据的快速复制
- 怎样实现从扫描仪输入图形并保存成图片格式。
- delphi5.0中如何控制excel報表欄的寬度????謝謝!!!!!
- 赚分,马上结...
- fastreport 空白行补充及分页问题
WHERE CRM_Customer_idea.Idea_order_id = :as_billid') ;
我覺得在這種設置SQL.TEXT的時候應該就寫上傳入的參數了﹐而不是用:as_billid這種方式了。如果你把這SQL寫到qry1的SQL屬性中就應該沒問題﹐不過執行的時候可以這樣﹕
ADOQuery1.Active:=false;
ADOQuery1.Parameters.ParamByName('as_billid').value:=你的值;
ADOQuery1.Active:=true;
所以我的sql语句和parameter都是传参进来。您再看看我下面的代码,那里就是进行参数赋值的直接写在qry1.sql中确实没有问题,这正是我感到迷惑的地方.
str_paras ,str_para :string ;
i ,int_pos :Integer ;
begin
with qry1 do
begin
Close;
sql.text := 'SELECT Idea_order_id ,'
+ '(select customer_name from tss_customer where customer_code = crm_customer_idea.customer_code ) as customer_name'
+ ' FROM CRM_Customer_idea WHERE (Idea_order_id = :as_billid)'; str_paras := edt1.Text ;
for i:=0 to Parameters.Count-1 do
begin
int_pos :=Pos(';',str_paras);
if int_pos <= 0 then
str_para := str_paras
else
str_para := Copy(str_paras,1,int_pos);
Parameters[i].Value := str_para;
Parameters[i].Size := Length(str_para) ;
str_paras :=Copy(str_paras,int_pos,Length(str_paras)- int_pos);
end;
Open;
end;
但是我不明白这是为什么。因为程序发布的时候。什么SQL语句都可能产生,从语法上来说,这里不带()也是合法的,另外sql.text 的引号是发贴的时候他自动换行了
数据库设置为空间自动增长试试
qry1.Close();
qry1.SQL.Text :=
'SELECT A.Idea_order_id, B.customer_name from ''#13#10+
'CRM_Customer_idea A, tss_customer B'#13#10 +
'where A.customer_code=B.customer_code and A.Idea_order_id=:as_billid';
str_paras := edt1.Text;
造成错误的原因可能是D在解析你的SQL中的参数时出现了异常另外,你那个循环解析赋参数值,好象有点问题,都带上了“;”
str_paras := edt1.Text ;
for i:=0 to qry1.Parameters.Count-1 do begin
int_pos :=Pos(';',str_paras);
if int_pos <= 0 then
str_para := str_paras
else
//str_para := Copy(str_paras,1,int_pos);
str_para := Copy(str_paras,1,int_pos-1);//应该不带";"号
qry1.Parameters[i].Value := str_para;
qry1.Parameters[i].Size := Length(str_para) ; //str_paras :=Copy(str_paras,int_pos,Length(str_paras)- int_pos);
str_paras :=Copy(str_paras,int_pos + 1,Length(str_paras)- int_pos);//也不带";" end ;
我最怕就是这个异常,try也不能捕捉,直接后果就是调用这个dll的应用程序都死掉了。难道adoquery的解析能力这么差吗?
如果只是关联两个表 用join就行了
并且你这样写 返回的数据是 left join 的 而不是 inner join
意思就是说 如果有一条数据 CRM_Customer_idea 表里有 而 tss_customer 表里没有
也会返回数据 只是 customer_name的值是null
不知道你是不是就打算要这样的结果
把SQL换一下
qry1.SQL.Add('SELECT a.Idea_order_id , b.customer_name from CRM_Customer_idea a inner join tss_customer b on a.customer_code=b.customer_code
and CRM_Customer_idea.Idea_order_id = :as_billid') ;
还有 delphi的string长度就255 SQL太长的话 象3楼那样用+号加起来
PS: where后面的条件用括号括起来是个好习惯 :)
var
qry1: TADOQuery;
begin
qry1 := TADOQuery.Create(nil);
qry1.ADOConnection := YourConnection;
....
end;
如果不报错了,说明有可能是你qry1的问题(已经不存在的对象)。
如果报错,说明可能真的是D或者ADO的问题,这个是最可怕!
明天到公司再做个简单的测试吧.哎头疼
或者你设置一下CacheSize