SQL动态参数查询问题!(20分)

  • 主题发起人 主题发起人 cansim
  • 开始时间 开始时间
C

cansim

Unregistered / Unconfirmed
GUEST, unregistred user!
用动态的参数可以访问字段,但不知道能不能动态地指定表格呢?
我试过不行,不知道能不能呢?
 
可以自己拼出SQL语句,这样实现更灵活。
 
可以自己拼出SQL语句,这样实现更灵活。正确!!
 
当然可以:
CREATE PROC DYNAMICSQL
@TIAOJIAN VARCHAR(200),
@TABLENAME VARCHAR(100)
AS
DECLARE STRSQL VARCHAR(500)
SET STRSQL='SELECT * FROM '+@TABLENAME +'WHERE '+ @TIAOJIAN
EXEC(STRSQL)
 
自己拼写是什么意思啊?
一直用SQL.ADD()的
什么书有介绍?
 
两种方式:
一、如shmm兄的例子
DECLARE STRSQL VARCHAR(500)
SET STRSQL='SELECT * FROM '+@TABLENAME +'WHERE '+ @TIAOJIAN
EXEC(STRSQL)
这一部分,可以写成这样
SQL.Add('DECLARE STRSQL VARCHAR(500)')
SQL.Add('SET STRSQL=''SELECT * FROM ''+@TABLENAME +''WHERE ''+ @TIAOJIAN')
SQL.Add('EXEC(STRSQL)')

二、用一个过程来实现,通过改变ATableName获得不同表的数据
procedure TdmMain.GetData(ATableName: String);
begin
with ADOQuery1 do
begin
SQL.Clear;
SQL.Add('select * from '+ATableName);
Open;
end;
end;
 
办法太多,只要多了解sql语言就行了。
 
Ayong:
SQL.Add('select * from '+ATableName);
~~~~~这里有空格吗?
 
有空格,都是玩SQL的,呵呵,最后搞成一帮笨蛋,我就是。
 
呵呵,我想应该也有空格,SQL其实不挺简单吗?
就那几个语句啊!
 
我用最简单的SQL语句在BDE的Query中也报错,请各位大虾分析分析。
(一个网格,一个数据源,一个query,一个按钮,)
我怎么不会用insert to这个SQL语句。updata也不会用。总是提示数据集不是
插入或编辑模式,我也不能用create table创建一个表。提示不能在一个关闭的数据集
上做这种操作。下面是我的代码:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, DBTables, Grids, DBGrids, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
Query1: TQuery;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
query1.Close ;
query1.SQL.Clear ;
query1.SQL.Add('insert into d:/biao/aa.db values ("01",5.21);');
query1.Post ;
query1.Active :=true;
end;

end.
 
好像不能带文件地质,不知道你的bde 咋做的连接。
连接做好了直接调用数据库名字就行了
query1.SQL.Add('insert into aa values ("01",5.21);');
 
我在水木清华论坛上发现一个清零游戏。(www.smth.edu.cn).我想用delphi编写。我本想
动态地生成一个表。但我在动态地插入一条记录时,总出现错误。
query1.sql.add('insert into aa ');
query1.sql.add('values(:bb,:cc)');
query1.execsql;
现在我静态地创建一个表。并用下面的方法解决了插入问题。
str:='';
str:='values('+'"'+bb+'","'+cc+'")';
form1.query1 .close;
form1.query1.SQL.Clear ;
form1.query1.sql.add('insert into "d:/aaa/biao/aa.db"');
form1.query1.sql.add(str);
form1.query1.ExecSQL ;
现在还有一个问题,就是del表中的最后一条记录。提示:Lnvalid file name。
有时侯提示不能创建光标句柄。代码如下:如需全部代码,请留下E-mail.
我的E-mail是kfzt@163.com
procedure TForm1.Label2Click(Sender: TObject);
var
table1:ttable;
begin
table1:=ttable.Create(self);
k:='"d:/aaa/biao/qingling.db"';
table1.TableName:=k;
table1.Open;
table1.Edit;
table1.Last ;
table1.Delete ;
ky(w,x);//我调用另一个过程,另有用途。w,x是全局变量。
end;
 
table1.open;
table1.last;
if not table1.isempty then
table1.delete;
另外执行不返回记录集合的Sql语句的时候,要用Tquery的Execsql,而不是open.
 
k:='"d:/aaa/biao/qingling.db"';
query1.RequestLive :=true;
query1.Active :=true;
query1.SQL.Add('delete form "d:/aaa/biao/qingling.db"');
{table1.TableName:=k;
table1.Open;
table1.Edit;
table1.Last ;
table1.Delete;}
ky(w,x);

是在删除sql语句出错的
 
要删除所有记录这样:
query1.close;
query1.sql.text := 'delete form "d:/aaa/biao/qingling.db"';
query1.execsql;
 
在table1.last后出错提示:无效的字段名
程序是为了删除一条记录。我把程序又改为table.
要用query部件,怎样删除一条记录。
 
用动态的参数可以访问字段,但不知道能不能动态地指定表格呢?
我试过不行,不知道能不能呢?

我不太明白意思
 
现在的问题是调用过程时出错。过程ky是为了悔棋。w,x是全局变量。表示单击的行号和列号。
提示:Invalid use of keyword.
Token :form
Line Number:1.
代码:
k:='"d:/aaa/biao/qingling.db"';
query1.RequestLive :=true;
query1.Close ;
query1.SQL.Clear ;
query1.SQL.Add('delete form "d:/aaa/biao/qingling.db"');
query1.ExecSQL ;
{table1.TableName:=k;
table1.open;
table1.last;
if not table1.isempty then
table1.delete; }
ky(w,x);

ky过程如下:
procedure ky(m,n:integer);
var
s:integer;
begin
s:=0;
c[m,n]:=c[m,n]+1;
if (c[m,n]=-1)then c[m,n]:=3;
if (m>1) then
begin
c[m-1,n]:=c[m-1,n]+1;
if (c[m-1,n]=-1)then c[m-1,n]:=3;
end;
if (n>1) then
begin
c[m,n-1]:=c[m,n-1]+1;
if (c[m,n-1]=-1) then c[m,n-1]:=3;
end;
if (m<6) then
begin
c[m+1,n]:=c[m+1,n]+1;
if (c[m+1,n]=-1)then c[m+1,n]:=3;
end;
if (n<6) then
begin
c[m,n+1]:=c[m,n+1]+1;
if (c[m,n+1]=-1)then c[m,n+1]:=3;
end;
kz; //把所做的改变显示在按钮的caption上。
for m:=1 to 6 do
for n:=1 to 6 do
s:=s+c[m,n];
if (s=0) then
showmessage ('成功了!') ;
end;
 
问题基本解决,谢谢大家!
 
后退
顶部