明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
12
返回列表 发新帖
楼主: cabinsummer

[源码] Lisp连接SQLite数据库

[复制链接]
 楼主| 发表于 2024-5-17 08:50:50 | 显示全部楼层
kozmosovia 发表于 2024-5-16 22:36
cad里面有Connectivity Automation Objects (ActiveX/CAO)可以连接数据库。不过很少有人用,除了CAD帮助, ...

都是Access和SQL Server数据库
发表于 2024-5-17 10:35:13 来自手机 | 显示全部楼层
先生大才,请问只能执行select语句吗?create table或insert这些是否也能执行,想加个参数,如(DoLite file sql)怎么加?谢谢
 楼主| 发表于 2024-5-17 15:17:46 | 显示全部楼层
夏生生 发表于 2024-5-17 10:35
先生大才,请问只能执行select语句吗?create table或insert这些是否也能执行,想加个参数,如(DoLite file ...

可以执行INSERT等语句。
如果你想对不同数据库操作,建议将这个程序改一下,
  1. if (tb.Length != 1)
  2. {
  3.     ret.Add(new TypedValue((int)LispDataType.Nil));
  4.     return ret;
  5. }

这一段改成
  1. if (tb.Length > 0)
  2. {
  3.     string database = tb[0].Value.ToString();
  4.     // 其它代码
  5. }

后面的ExecuteDataTable,ExecuteNonQuery方法里的连接字符串根据这个database来实现
发表于 2024-5-18 19:37:18 来自手机 | 显示全部楼层
C#的dll我已经分享过了,还有所有版本的arx
发表于 2024-5-18 19:38:46 来自手机 | 显示全部楼层
你既然写了这个,其实就可以做注册授权了,不过c#无论怎么混淆都是源码,这就是我为啥用go语言的原因
发表于 2024-8-31 21:18:47 | 显示全部楼层
楼主历害。开辟新玩法
发表于 2024-8-31 21:29:06 | 显示全部楼层
本帖最后由 ggosgg 于 2024-8-31 21:31 编辑

using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Runtime;
using System;
using System.Data;
using System.Data.SQLite;
using System.IO;
using System.Security.Cryptography;
using System.Text;
using System.Text.RegularExpressions;

namespace SQLite
{
    public static class SQLiteLsp
    {
        [LispFunction("DoLite")]
        public static ResultBuffer DoLite(ResultBuffer rbArgs)
        {
            ResultBuffer ret = new ResultBuffer();
            TypedValue[] tb = rbArgs.AsArray();
            if (tb.Length != 1)
            {
                ret.Add(new TypedValue((int)LispDataType.Nil));
                return ret;
            }
            if (tb[0].TypeCode != (int)LispDataType.Text)
            {
                ret.Add(new TypedValue((int)LispDataType.Nil));
                return ret;
            }
            string sql = tb[0].Value.ToString().ToUpper().Trim();
            if (sql.Length < 6)
            {
                ret.Add(new TypedValue((int)LispDataType.Nil));
                return ret;
            }
            switch (Regex.Match(sql, @"^[A-Z]+\b").Value)
            {
                case "SELECT":
                    System.Data.DataTable dt = DAL.ExecuteDataTable(sql);
                    if (dt == null)
                    {
                        ret.Add(new TypedValue((int)LispDataType.Nil));
                        return ret;
                    }
                    ret.Add(new TypedValue((int)LispDataType.ListBegin));
                    ret.Add(new TypedValue((int)LispDataType.ListBegin));
                    for (int i = 0; i < dt.Columns.Count; i++)
                    {
                        ret.Add(new TypedValue((int)LispDataType.Text, dt.Columns[有个i].ColumnName));
                    }
                    ret.Add(new TypedValue((int)LispDataType.ListEnd));
                    foreach (DataRow dr in dt.Rows)
                    {
                        ret.Add(new TypedValue((int)LispDataType.ListBegin));
                        for (int k = 0; k < dt.Columns.Count; k++)
                        {
                            switch (dr[k].GetType().ToString())
                            {
                                case ("System.String"):
                                case ("System.DateTime"):
                                    ret.Add(new TypedValue((int)LispDataType.Text, dr[k].ToString()));
                                    break;
                                case ("System.Int32"):
                                    ret.Add(new TypedValue((int)LispDataType.Int32, (int)dr[k]));
                                    break;
                                case ("System.Int16"):
                                    ret.Add(new TypedValue((int)LispDataType.Int16, (short)dr[k]));
                                    break;
                                case ("System.Boolean"):
                                    if (Convert.ToBoolean(Convert.ToInt32(dr[k])))
                                        ret.Add(new TypedValue((int)LispDataType.T_atom));
                                    else
                                        ret.Add(new TypedValue((int)LispDataType.Nil));
                                    break;
                                default:
                                    ret.Add(new TypedValue((int)LispDataType.Nil));
                                    break;
                            }
                        }
                        ret.Add(new TypedValue((int)LispDataType.ListEnd));
                    }
                    ret.Add(new TypedValue((int)LispDataType.ListEnd));
                    break;
                case "CREATE":
                case "RENAME":
                case "INSERT":
                case "DELETE":
                case "UPDATE":

                case "DROP":
                case "ALTER":
                    if (DAL.ExecuteNonQuery(sql))
                        ret.Add(new TypedValue((int)LispDataType.T_atom));
                    else
                        ret.Add(new TypedValue((int)LispDataType.Nil));
                    break;
                default:
                    ret.Add(new TypedValue((int)LispDataType.Nil));
                    break;
            }
            return ret;
        }
    }

    public static class DAL
    {
        private static string LiteSetting = "Data Source=D:\\SqltiteData.db";    // 自己的数据库

        public static System.Data.DataTable ExecuteDataTable(string sql)
        {
            System.Data.DataTable dt = new System.Data.DataTable();
            try
            {
                using (SQLiteConnection cn = new SQLiteConnection(LiteSetting))
                {
                    using (SQLiteCommand cmd = new SQLiteCommand(sql, cn))
                    {
                        using (SQLiteDataAdapter dataAdapter = new SQLiteDataAdapter())
                        {
                            dataAdapter.SelectCommand = cmd;
                            dataAdapter.Fill(dt);
                        }
                    }
                }
            }
            catch
            {
                return null;
            }
            return dt;
        }

        public static bool ExecuteNonQuery(string sql)
        {
            bool ret = false;
            using (SQLiteConnection cn = new SQLiteConnection(LiteSetting))
            {
                cn.Open();
                using (SQLiteTransaction trans = cn.BeginTransaction())
                {
                    using (SQLiteCommand cmd = new SQLiteCommand(sql, cn))
                    {
                        try
                        {
                            cmd.ExecuteNonQuery();
                            trans.Commit();
                            ret = true;
                        }
                        catch
                        {
                            trans.Rollback();
                        }
                    }
                }
                cn.Close();
            }
            return ret;
        }
    }
}
发表于 2024-8-31 21:35:10 来自手机 | 显示全部楼层
我用Access数据库这么多年没见崩溃过,其实不管是什么,精通了就如鱼得水。毕竟是成熟的库
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 07:40 , Processed in 0.177140 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表