cad里面有Connectivity Automation Objects (ActiveX/CAO)可以连接数据库。不过很少有人用,除了CAD帮助, ...
都是Access和SQL Server数据库 先生大才,请问只能执行select语句吗?create table或insert这些是否也能执行,想加个参数,如(DoLite file sql)怎么加?谢谢 夏生生 发表于 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来实现 C#的dll我已经分享过了,还有所有版本的arx 你既然写了这个,其实就可以做注册授权了,不过c#无论怎么混淆都是源码,这就是我为啥用go语言的原因 楼主历害。开辟新玩法 本帖最后由 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;
}
}
} 我用Access数据库这么多年没见崩溃过,其实不管是什么,精通了就如鱼得水。毕竟是成熟的库
页:
1
[2]