【问题标题】:Flex 4.6 actionscript 3 executing a SQL alter statmentFlex 4.6 actionscript 3 执行 SQL alter 语句
【发布时间】:2013-12-18 00:11:09
【问题描述】:

您好,我有一个正在运行的程序,我有一个客户问我是否可以在我的程序中添加一个注释部分,好主意。我添加了以下代码:

private var insertStmt:SQLStatement;
private function updateTable():void
        {
            insertStmt = new SQLStatement();
            insertStmt.sqlConnection = conn;
            var sql:String = "";
            sql += "ALTER TABLE Customersold ADD Note TEXT;";
            insertStmt.text = sql;
            insertStmt.execute();

如果客户第一次使用此版本,它运行良好,但在第二次运行后,我收到一个错误,表明该列已存在。我该如何解决这个问题?

conn btw 是我的 sql 连接。

编辑:这是一个程序而不是移动应用程序。

【问题讨论】:

  • 您想将同一列添加两次?
  • 不,我想添加一次并确保它不会再次尝试添加
  • 我想我试图找到一种方法来检查列是否存在,如果它没有添加它,如果它确实继续前进。不确定这是否可以在 actionscript 中完成。
  • @JoshuaMiller:你解决了吗?
  • @JoeTaras 抱歉延迟回复我确实通过将版本添加到我的数据库并检查版本来解决问题

标签: sql actionscript-3 apache-flex flex4.6


【解决方案1】:

不要将语句运行两次。如果您要求 SQLLite 添加已经存在的列,那么抛出错误是预期的行为。

如果您最终在您的应用程序中使用更新脚本(这种情况并不少见),那么处理它的常用方法是在您的数据库中存储一个版本号并根据需要逐步应用升级。由于您还没有这样做,您还可以假设如果没有版本号,那么它就是版本 1。只需在您的应用启动时在某个地方检查一下即可。

伪代码:

var version:int = getAppVersionFromDB();
if(version < 2) 
{
    applyV2();
}
if(version < 3) 
{
    applyV3();
}
...  etc ....

然后像现在一样更新功能。

private function applyV2():void
{
    ... some schema changes here ...
   updateSavedVersion(2);
}

您可以自己充实这些功能。

【讨论】:

  • 如何设置版本?
  • 或者你怎么知道你应该使用什么版本?
  • 通常,您也可以通过将其保存在数据库中的某个位置来设置版本(专用版本表,设置表,没关系)。您应该使用的版本是您的应用代码中可能存在的最高版本。
  • 好的,在我的程序中,我将版本设置为 1,然后当将列注释放入其中时,将版本更改为 2,现在我遇到的问题是从表中获取版本跨度>
  • 这很好用,我将它设置为检查版本表 if == null 然后它创建版本表添加起始版本。然后检查 version = 1 它是否运行代码以将注释添加到 Customersold 并添加现在我们处于版本 2 的事实。我现在可以将其用于新更新。非常感谢!现在我剩下的就是查找如何从我的 Web 服务器上的 .php 文件中获取发送和接收数据。
【解决方案2】:

您的检查查询更改了关于下划线 DBMS。

在您的 ADD COLUMN 语句之前,您必须启动此查询(由 DBMS 不同):

SQL 服务器

SELECT COUNT(*) FROM syscolumns c
JOIN sysobjects o
ON c.id = o.id
WHERE o.name = 'Customersold'
AND c.name = 'Note'

甲骨文

SELECT COUNT(*) FROM ALL_TAB_COLUMNS c
WHERE c.table_name = 'Customersold'
AND c.column_name = 'Note'

MySql

SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS c
WHERE c.table_name = 'Customersold'
AND c.column_name = 'Note'

如果结果返回一个数字 > 0 所以你不要添加你的列(因为存在)

你的方法变成了:

private function updateTable():void
{
    var checkStmt:SQLStatement = new SQLStatement();
    checkStmt.sqlConnection = conn;
    var sql:String = "ABOVE QUERY";
    checkStmt.text = sql;
    checkStmt.execute();
    checkStmt.getResult(); <-- Here you get the result of your select

    if (CONDITION ABOUT NOT EXISTING FIELD) {
        insertStmt = new SQLStatement();
        insertStmt.sqlConnection = conn;
        sql = "ALTER TABLE Customersold ADD Note TEXT;";
        insertStmt.text = sql;
        insertStmt.execute();
    }
}

【讨论】:

  • 当您说“ABOVE3 QUERY”时,表示插入您列出的第 3 种方法?
  • @JoshuaMiller:向我道歉!三个数字是输入错误;) ABOVE QUERY(在您的 DBMS 的基础上)
  • 我还不能测试,我还要工作 3 个小时。我回家后会测试谢谢!
  • @JoshuaMiller:嗨,别担心 ;) 我非常好奇 :D :D
  • 只是为了确保我理解第一个 var sql:String = "ABOVE QUERY";将是三件事之一。我如何知道 SQL AIR 的版本是什么?该程序为我创建数据库
猜你喜欢
  • 2021-09-05
  • 1970-01-01
  • 1970-01-01
  • 2014-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-30
相关资源
最近更新 更多