gpt4 book ai didi

sql-server - 使用 Delphi 的 CREATE/ALTER 过程

转载 作者:行者123 更新时间:2023-12-03 19:50:24 24 4
gpt4 key购买 nike

我有一个小问题,我找不到答案。我需要从 Delphi 创建/更改一些程序。

所以这是我的代码,它从文件中获取代码并尝试执行它。

procedure TfrmMainApp.actRulezaScriptExecute(Sender: TObject);
var
j: Int32;
sql: string;
commandFile: TextFile;
Linie: string;
affRows: Int32;
err: string;
begin

for j := 0 to filesToExecute.Count - 1 do
begin
sql := 'USE ' + DBName + #10#13;
sql := sql + ' GO ' + #10#13;
AssignFile(commandFile, filesToExecute[j]);
Reset(commandFile);
while not EOF(commandFile) do
begin
Readln(commandFile, Linie);
sql := sql + #10#13 + Linie;
end;
dmMainScriptRun.ExecuteCommand(sql, err, affRows);
if err <> '' then
break;
Memo1.Lines.Add('Affected rows:' + IntToStr(affRows));
end;

end;


function TdmMainScriptRun.ExecuteCommand(sqlCommand: string; var err: string;
var affRows: Int32): Boolean;
begin
err := '';
try
with cmd do
begin
CommandText := sqlCommand;
Execute(affRows, EmptyParam);
end;
except
on E: Exception do
begin
err := E.Message;
end;
end;
end;

所以我的文件看起来像这样
CREATE PROCEDURE sp_TestSebi
AS

print ('testSebi')

我的命令看起来像这样(它取自 SQL Server Profiler)
USE Test

GO


CREATE PROCEDURE sp_TestSebi

AS


print ('testSebi')

执行此命令返回 err Incorrect syntax near 'GO'在没有 GO 语句的情况下运行脚本 return err CREATE/ALTER PROCEDURE' must be the first statement in a query batch因为 USE 子句。

有没有办法可以从 Delphi 创建一个程序?我需要 use 语句,因为我正在尝试在多个数据库上执行脚本。

最佳答案

您尝试这样做的方式可以通过多种方式进行改进。

首先,试试这个:

  • 新建VCL工程
  • 在表单上放置一个 TAdoConnection 和一个 TAdoQuery。还要在上面放一个 TButton。
  • 将 TAdoQuery 连接到 TAdoConnection。
  • 设置 TAdoConnection 连接到你的 Sql Server
  • 在下面的代码中,修改 scUse 常量以引用您的目标数据库
    和 scCreateView 引用不存在的 View 数据库中的有效表。这是为了确保创建 View 不会因为 View 已经存在或表不存在而失败。

  • 运行代码,您应该会收到一条投诉,即 Create View 引用了无效的对象名称,因为执行 Create View 时 AdoConnection 未连接到您的目标数据库。

    然后将 KeepConnection 更改为 True 并重新测试。这次应该成功创建 View 。
    const
    scUse ='use m4common';
    scCreateView = 'create view vwtest as select * from btnames';

    procedure TForm1.Button1Click(Sender: TObject);
    begin
    AdoConnection1.DefaultDatabase := 'Master';
    // The point of changing the default database in the line above
    // is to ensure for demo purposes that the 'Use' statement
    // is necessary to change to the correct db.

    AdoConnection1.KeepConnection := False; // retest with this set to True
    AdoQuery1.SQL.Text := scUse;
    AdoQuery1.ExecSQL;

    AdoQuery1.SQL.Text := scCreateView;
    AdoQuery1.ExecSQL;
    end;

    所以,KeepConnection 的意义在于让你在同一个连接上下文中执行两个或多个 Sql 批处理,并让服务器满足 Create View 语句(或类似语句)可以是批处理中的第一个语句,同时,创建 View 应用的数据库与您在上一批中“使用”的数据库相同。

    其次,您的 AssignFile ... 而不是 Eof 是不必要的冗长且容易出错。尝试这样的事情:
    var
    TL : TStringList;
    begin
    TL := TStringList.Create;
    try
    for j := 0 to filesToExecute.Count - 1 do
    begin
    sql := 'USE ' + DBName + #13#10;
    sql := sql + ' GO ' + #13#10;
    TL.BeginUpdate; // for better performance with longer scripts
    TL.LoadFromFile(filesToExecute[j]);
    TL.Insert(0, sql);
    TL.EndUpdate;
    // execute the Sql here etc
    end;
    finally
    TL.Free;
    end;
    end;

    请注意,我已经颠倒了你的 #10 和 #13 的顺序,所以它是正确的。

    另一点是,由于您的备忘录的 Lines 属性已经有一个 LoadFromFile 方法,您实际上并不需要我的临时 TStringList,TL,因为您可以将加载到您的备忘录中(尽管您可能更愿意将这两种用途分开)。

    关于sql-server - 使用 Delphi 的 CREATE/ALTER 过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35454931/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com