cabinsummer 发表于 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)怎么加?谢谢

cabinsummer 发表于 2024-5-17 15:17:46

夏生生 发表于 2024-5-17 10:35
先生大才,请问只能执行select语句吗?create table或insert这些是否也能执行,想加个参数,如(DoLite file ...

可以执行INSERT等语句。
如果你想对不同数据库操作,建议将这个程序改一下,
if (tb.Length != 1)
{
    ret.Add(new TypedValue((int)LispDataType.Nil));
    return ret;
}
这一段改成
if (tb.Length > 0)
{
    string database = tb.Value.ToString();
    // 其它代码
}
后面的ExecuteDataTable,ExecuteNonQuery方法里的连接字符串根据这个database来实现

dcl1214 发表于 2024-5-18 19:37:18

C#的dll我已经分享过了,还有所有版本的arx

dcl1214 发表于 2024-5-18 19:38:46

你既然写了这个,其实就可以做注册授权了,不过c#无论怎么混淆都是源码,这就是我为啥用go语言的原因

ggosgg 发表于 2024-8-31 21:18:47

楼主历害。开辟新玩法

ggosgg 发表于 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
    {
      
      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.TypeCode != (int)LispDataType.Text)
            {
                ret.Add(new TypedValue((int)LispDataType.Nil));
                return ret;
            }
            string sql = tb.Value.ToString().ToUpper().Trim();
            if (sql.Length < 6)
            {
                ret.Add(new TypedValue((int)LispDataType.Nil));
                return ret;
            }
            switch (Regex.Match(sql, @"^+\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.GetType().ToString())
                            {
                              case ("System.String"):
                              case ("System.DateTime"):
                                    ret.Add(new TypedValue((int)LispDataType.Text, dr.ToString()));
                                    break;
                              case ("System.Int32"):
                                    ret.Add(new TypedValue((int)LispDataType.Int32, (int)dr));
                                    break;
                              case ("System.Int16"):
                                    ret.Add(new TypedValue((int)LispDataType.Int16, (short)dr));
                                    break;
                              case ("System.Boolean"):
                                    if (Convert.ToBoolean(Convert.ToInt32(dr)))
                                        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;
      }
    }
}

gzxl 发表于 2024-8-31 21:35:10

我用Access数据库这么多年没见崩溃过,其实不管是什么,精通了就如鱼得水。毕竟是成熟的库
页: 1 [2]
查看完整版本: Lisp连接SQLite数据库