使用Javascript读写访问数据库

13

首先,我想提醒大家,在Web交互中与数据库的交互应该始终使用服务器端语言,这是因为安全原因和JavaScript本身并不支持Windows文件系统的兼容性。

话虽如此,我目前面临了一个棘手的情况,正在尝试创造性地思考。我被禁止访问任何服务器端脚本和SQL。

我需要为内部网络创建一个基于客户端的应用程序,能够随着时间的推移存储数据。

到目前为止,我已经找到了两种解决方案,但都没有足够的文档让我正确地使用它们。

其中一种是一个名为ACCESSdb的JavaScript库,可以在ACCESSdb找到,但我无法理解如何使用它来从数据库中读写数据……

另外一种是以下三段代码:

添加记录:

function AddRecord() {
var adoConn = new ActiveXObject("ADODB.Connection");
var adoRS = new ActiveXObject("ADODB.Recordset");

adoConn.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source='/\dbName.mdb'");
adoRS.Open("Select * From tblName", adoConn, 1, 3);

adoRS.AddNew;
adoRS.Fields("FieldName").value = "Quentin";
adoRS.Update;

adoRS.Close();
adoConn.Close();
}  

删除记录:

function DeleteRecord() {
var adoConn = new ActiveXObject("ADODB.Connection");
var adoRS = new ActiveXObject("ADODB.Recordset");

adoConn.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source='\\dbName.mdb'");
adoRS.Open("Select * From tblName Where FieldName = 'Quentin'", adoConn, 1, 3);
adoRS.Delete;
adoRS.Delete;

adoRS.Close();
adoConn.Close();
}  

编辑记录:

function EditRecord() {
var adoConn = new ActiveXObject("ADODB.Connection");
var adoRS = new ActiveXObject("ADODB.Recordset");

adoConn.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source='\\dbName.mdb'");
adoRS.Open("Select * From tblName Where FieldName = 'Quentin'", adoConn, 1, 3);

adoRS.Edit;
adoRS.Fields("FieldName").value = "New Name";
adoRS.Update;

adoRS.Close();
adoConn.Close();
}  

其中只有添加新记录这个选项对我起作用了...
我还发现,要读取第一行中任何一个单元格的值,我只需要写:

alert(adoRS(cellNum));  

但是我如何获取后面行中单元格的值呢?比如说(第3行,第5个单元格)。

非常感谢您一直阅读到这里!我将非常感激您的帮助!

Jake


我以前没有使用过由ActiveXObject创建的ADODB,但您可以尝试将adoRS.Delete更改为adoRS.Delete()adoRS.Edit更改为adoRS.Edit(),并将adoRS.Update更改为adoRS.Update()。您需要使用一个ms-access数据库(它在网络共享或其他地方)吗? - Prusse
谢谢,我会尝试你的建议。是的,它将放在网络驱动器上。另外,您知道如何从第一行以下的行中提取单元格中的值吗? - Jake
1
你尝试过 adoRS.moveNext() 吗?http://msdn.microsoft.com/en-us/library/windows/desktop/ms677527(v=vs.85).aspx - Prusse
谢谢,它确实让我进入了下一条记录。 :) 不过,您知道有没有一种方法可以在不循环adoRS.moveNext() 50次的情况下直接跳到第50条记录?比如说adoRS.moveNext(50)之类的... - Jake
我刚刚尝试了adoRS.Delte(),它完美地工作了。非常感谢Prusse。之前我甚至没有去看MSDN网站,因为我认为里面的所有方法都只适用于微软语言(C、C++、C#、VB...),我没想到JavaScript也会被支持。我原本预计会遇到更复杂的问题。 - Jake
显示剩余2条评论
2个回答

5
首先,请确保在 SO 中出现的“/ \”和连接字符串中的“\”只是打字错误。
其次,这是一个 Delete 命令的版本:
function DeleteRecord() {
var adoConn = new ActiveXObject("ADODB.Connection");
var adoCmd = new ActiveXObject("ADODB.Command");

adoConn.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source='\\dbName.mdb'");
adoCmd.ActiveConnection = adoConn;
adoCmd.CommandText = "Delete * From tblName Where FieldName = 'Quentin'";
adoCmd.Execute();

adoConn.Close();
}

同时,编辑命令(无需循环 -> 更新所有[匹配]记录):

function EditRecord() {
var adoConn = new ActiveXObject("ADODB.Connection");
var adoCmd = new ActiveXObject("ADODB.Command");

adoConn.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source='\\dbName.mdb'");
adoCmd.ActiveConnection = adoConn;
adoCmd.CommandText = "Update tblName Set FieldName = 'New Value' Where FieldName = 'Quentin'";
adoCmd.Execute();

adoConn.Close();
}  

请注意,我没有测试过这个(现在没有访问权限),所以可能会有一些语法错误...
希望它能够工作并且有所帮助。

谢谢。我有一个问题,ADODB.Command和ADODB.Recordset之间有什么区别?什么情况下会更适合使用其中的一个而不是另一个? - Jake
我认为这些链接可能有助于了解差异:http://www.w3schools.com/ADO/ado_ref_command.asp 和 http://www.w3schools.com/ADO/ado_ref_recordset.asp - Igor Turman
adoCmd.CommandText("Delete * From tblName Where FieldName = 'Quentin'"); 对我来说没有用,但是 adoCmd.CommandText="Delete * From tblName Where FieldName = 'Quentin'"; 确实有效,仅供参考。 - Martin O Leary
@MartinOLeary,谢谢您指出!我已经进行了更正。 - Igor Turman

0
    function loadDB() {

    var connection = new ActiveXObject("ADODB.Connection");
    var connectionstring = "Data Source=.;Initial Catalog=EmpDetail;Persist Security Info=True;User ID=sa;Password=Micr0s0ft;Provider=SQLOLEDB";
    connection.Open(connectionstring);

    var rs = new ActiveXObject("ADODB.Recordset");
    rs.Open("select * from emp", connection);
    rs.MoveFirst();

    var span = document.createElement("span");

    span.style.color = "Blue";

    span.innerText = "  ID " + "  Name " + "   Salary";

    document.body.appendChild(span);

    while (!rs.eof){

        var span = document.createElement("span");
        span.style.color = "green";

        span.innerText = "\n " + rs.fields(0) + " |  " + rs.fields(1) + " |  " + rs.fields(2);

        document.body.appendChild(span);

        rs.MoveNext();
    }
    rs.close();
    connection.close();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接