Чтение параметров резьбы из thread.db

Автор anton.gorschnev, 27.03.26, 16:47:15

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

anton.gorschnev

  Всем доброго дня, возникла проблема с чтением данных резьбы из thread.db, прошу помощи.
Для чтения использовал Microsoft.Data.Sqlite но возникла проблема при помещение кода в проект библиотеки для Компас3D возникает ошибка, в консольном проекте все отработало нормально.
using (var connection = new SqliteConnection("Data Source=‪C:\\ProgramData\\ASCON\\KOMPAS-3D\\22\\Databases\thread.db"))
            {
                connection.Open();
                // ...
            }
Моя задача прочитать список доступных стандартов на резьбу, список резьб по выбранному стандарту. Возможно есть другие способы по мимо чтения файла thread.db?

p3452

#1
Возможно строка подключения НЕПРАВИЛЬНАЯ (слеши и их количество + нет интерпретатора строки - 2 ошибки в одной строке) или неполная...
Никогда не пользую Microsoft-ские драйвера, поэтому точнее сказать не могу, но вот так на родных драйверах
date.sFileDB = "DB1.db";
date.sPathDB = System.Environment.CurrentDirectory+ System.IO.Path.DirectorySeparatorChar+ "DATA");
date.sDB =  Path.Combine(date.sPathDB, date.sFileDB);  // полный путь к базе данных
// или так  date.sDB = date.sPathDB+ System.IO.Path.DirectorySeparatorChar+ date.sFileDB;

// Строка подключения
date.sConn = "Data Source=" + date.sDB+ ";Pooling=true;FailIfMissing=false"  // может быть еще и +  ";Version=3;New=True;Compress=True;"

Student2025

Цитата: p3452 от 27.03.26, 18:49:52Microsoft-ские драйвера,
Там сие творение - что то с чем то - порождают кучу процессов и это все так лагает что лучше от греха отказаться!

Soultaker

Цитата: p3452 от 27.03.26, 18:49:52Возможно строка подключения НЕПРАВИЛЬНАЯ (слеши и их количество + нет интерпретатора строки - 2 ошибки в одной строке) или неполная...
VS не дала бы скомпилировать.

Цитата: p3452 от 27.03.26, 18:49:52Никогда не пользую Microsoft-ские драйвера, поэтому точнее сказать не могу, но вот так на родных драйверах
Мощно

Цитата: anton.gorschnev от 27.03.26, 16:47:15Для чтения использовал Microsoft.Data.Sqlite но возникла проблема при помещение кода в проект библиотеки для Компас3D возникает ошибка, в консольном проекте все отработало нормально.
Потому что в КОМПАС корявая доменная система. Что-то мне подсказывает, что SQLite в Вашем проекте не совпадает по версии с версией КОМПАС. Я думаю дальше сами разовьёте мысль.
Это Вы ещё стили для WPF не писали, там тоже приколы есть.

p3452

Soultaker, поменьше трепотни - "знаток" Вы наш :o:

p3452


Soultaker


anton.gorschnev

Базу то я прочитал, использовал https://sqliteonline.com/. Есть еще вариант ее в эксель пересохранить или себе на сервер скопировать эти таблицы. Но хотелось работать с родным файлом, мало ли в новых версиях Компас3D что поменяется.Попробую еще несколько вариантов, отпишу что получилось. У кого есть рабочий вариант буду благодарен.

Chipollino

Цитата: anton.gorschnev от 27.03.26, 16:47:15Для чтения использовал Microsoft.Data.Sqlite но возникла проблема при помещение кода в проект библиотеки для Компас3D возникает ошибка, в консольном проекте все отработало нормально.
А ошибку опубликовать не хотите - с этой информацией всяко проще будет помочь?

Может там обычный конфликт блокировок. Пробовали Ваше консольное приложение запускать с уже работающим Компасом?

anton.gorschnev

c NuGet принес Microsoft.EntityFrameworkCore.Sqlite.Design v.1.1.5. Создаю консольный проект запускаю следующий код, все  работает.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Data.Sqlite;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var connection = new SqliteConnection("Data Source=C:\\ProgramData\\ASCON\\KOMPAS-3D\\22\\Databases\\thread.db")) //C:\\ProgramData\\ASCON\\KOMPAS-3D\\22\\Databases\\
            {
                connection.Open();
                string sqlExpression = "SELECT * FROM 'cil0_24705-2004 coarse'";
                SqliteCommand command = new SqliteCommand(sqlExpression, connection);
                using (SqliteDataReader reader = command.ExecuteReader())
                {
                    if (reader.HasRows) // если есть данные
                    {
                        while (reader.Read())   // построчно считываем данные
                        {
                            double d = reader.GetDouble(0);
                            double p = reader.GetDouble(1);
                            double d1 = reader.GetDouble(2);
                            long row = reader.GetInt64(3);
                            string title = reader.GetString(4);
                            System.Diagnostics.Debug.Print ($"{d} \t {p} \t {d1} \t {row} \t {title}");
                        }
                    }
                }
            }
        }
    }
}

помещаю этот код в проект приложения для Компас3D v22, получаю ошибку. Код даже не доходит до строки подключения, вышибает на попытке обратиться к процедуре где есть строка подключения.
ЦитироватьПоиск источника для "f:\dd\ndp\clr\src\BCL\system\rttype.cs". (No checksum.)
Файл "f:\dd\ndp\clr\src\BCL\system\rttype.cs" не существует.
Поиск в документах скриптов для "f:\dd\ndp\clr\src\BCL\system\rttype.cs"...
Поиск в проектах для "f:\dd\ndp\clr\src\BCL\system\rttype.cs".
Файл не был найден в проекте.
Поиск в каталоге "C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.16.27023\include\"...
Поиск в каталоге "C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.16.27023\include\cvt\"...
Поиск в каталоге "C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.16.27023\include\msclr\"...
Поиск в каталоге "C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.16.27023\include\sys\"...
Поиск в каталоге "C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.16.27023\include\thr\"...
Поиск в каталоге "C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.16.27023\crt\src\"...
Поиск в каталоге "C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.16.27023\crt\src\x64\"...
Поиск в каталоге "C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.16.27023\crt\src\arm\"...
Поиск в каталоге "C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.16.27023\crt\src\concrt\"...
Поиск в каталоге "C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.16.27023\crt\src\i386\"...
Поиск в каталоге "C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.16.27023\crt\src\linkopts\"...
Поиск в каталоге "C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.16.27023\crt\src\stl\"...
Поиск в каталоге "C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.16.27023\crt\src\vccorlib\"...
Поиск в каталоге "C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.16.27023\crt\src\vcruntime\"...
Поиск в каталоге "C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.16.27023\atlmfc\src\mfc\"...
Поиск в каталоге "C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.16.27023\atlmfc\src\atl\"...
Поиск в каталоге "C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.16.27023\atlmfc\include\"...
Настройки исходных файлов отладки для активного решения указывают, что отладчик не будет запрашивать у пользователя поиск файла: f:\dd\ndp\clr\src\BCL\system\rttype.cs.
Отладчику не удалось обнаружить исходный файл "f:\dd\ndp\clr\src\BCL\system\rttype.cs".

Chipollino

Цитата: anton.gorschnev от 30.03.26, 09:24:52c NuGet принес Microsoft.EntityFrameworkCore.Sqlite.Design v.1.1.5. Создаю консольный проект запускаю следующий код, все  работает.

помещаю этот код в проект приложения для Компас3D v22, получаю ошибку. Код даже не доходит до строки подключения, вышибает на попытке обратиться к процедуре где есть строка подключения.
Я правильно понимаю, что код компилируется, но при запуске падает?

Этот NuGet пакет в новое решение с компасовским плагином добавляли, или только кусок кода скопировали?

anton.gorschnev

Все как полагается, библиотеки с NuGet установил в проект с Компасом, код добавил в процедуру где мне надо прочитать резьбы. Проект запустился, работает до того момента пока я не обращусь к процедуре где есть строка подключения, в этот момент все вылетает.

anton.gorschnev

Рабочий вариант, под версию Компас 22 протестил работает.
С NuGet нужны следующие библиотеки: EntityFramework, System.Data.SQLite(основная), Stub.System.Data.SQLite.Core.NetFramework, System.Data.SQLite.Core, System.Data.SQLite.EF6, System.Data.SQLite.Linq.
using System;
using System.IO;
using System.Drawing;
using System.Diagnostics;
using System.Collections.Generic;
using System.Data.SQLite;


namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            using (SQLiteConnection Connect = new SQLiteConnection(@"Data Source=C:\\ProgramData\\ASCON\\KOMPAS-3D\\22\\Databases\\thread.db; Version=3;"))
            {
                Connect.Open();

                SQLiteCommand Command = new SQLiteCommand

                {

                    Connection = Connect,

                    CommandText = @"SELECT * FROM [description] WHERE [tablename] NOT NULL"

                };
                SQLiteDataReader sqlReader = Command.ExecuteReader();
                while (sqlReader.Read()) // считываем и вносим в лист все параметры

                {
                    System.Diagnostics.Debug.Print(sqlReader["displayname"].ToString());
                   

                }

                Connect.Close();
            }

        }
    }
}

Soultaker

Я же вроде написал в чём проблема, а потом в сообщении, которое удалил модератор, развил тему.
Из-за этого косяка мне пришлось выбрать другую БД - LiteDB.

p3452

Цитата: Soultaker от 30.03.26, 11:55:11Я же вроде написал в чём проблема, а потом в сообщении, которое удалил модератор, развил тему.
Из-за этого косяка мне пришлось выбрать другую БД - LiteDB.
У "плохого портного, всегда, игла кривая"!

Soultaker

Цитата: p3452 от 30.03.26, 14:37:25У "плохого портного, всегда, игла кривая"!
Опять флудерские посты ни о чём? При чём из-за Вашего поста удалили мой пост.
Что интересно, Вы так и не ответили на мой вопрос.

anton.gorschnev

Не хочу использовать NuGet. Нашел открытый проект подключения к Sqlite, хотел обойтись встроенными библиотеками с этого проекта но увы при подключении к проекту Компаса опять наблюдался отвал, на консольном все работает. Хорошо есть исходники кода, залил код в свой проект все завелось, решил остаться на этом варианте.

p3452

Цитата: anton.gorschnev от 30.03.26, 11:39:01С NuGet нужны следующие библиотеки: EntityFramework, System.Data.SQLite(основная), Stub.System.Data.SQLite.Core.NetFramework, System.Data.SQLite.Core, System.Data.SQLite.EF6, System.Data.SQLite.Linq.

1. Ничего из ЭТОГО не нужно!
Достаточно - System.Data.SQLite, который есть в папке Компаса...
2. Вы точно понимаете смысл Вашего кода, который считаете "рабочим"?
БД_tread2.png

anton.gorschnev

Файл библиотеки System.Data.SQLite находиться в папке C:\Program Files\ASCON\KOMPAS-3D v22\Bin, в проекте нужна ссылка именного на него, его версия 1.0.105.2. Делал с ссылкой на библиотеку версии 2.03 проект отваливается! дальше все просто пример кода ниже.
Globals.g_KompasObject.ksGetSystemVersion(out int Major, out int Minor, out int Release, out int Build);
            SQLiteConnection connection;
            SQLiteCommand command;
            try
            {
                connection = new SQLiteConnection($"Data Source=C:\\ProgramData\\ASCON\\KOMPAS-3D\\{Major}\\Databases\\thread.db;Version=3; FailIfMissing=True");
                connection.Open();
                command = new SQLiteCommand(connection);
                command.CommandText = "SELECT * FROM 'description'";
                DataTable data = new DataTable();
                SQLiteDataAdapter adapter = new SQLiteDataAdapter(command);
                adapter.Fill(data);
                Debug.Print($"Прочитано {data.Rows.Count} записей из таблицы БД");
                foreach (DataRow row in data.Rows)
                {
                    Debug.Print($"displayname = {row.Field<string>("displayname")} tablename = {row.Field<string>("tablename")}");
                }
            }
            catch (SQLiteException ex)
            {
                Debug.Print($"Ошибка доступа к базе данных. Исключение: {ex.Message}");
            }

p3452

//!  Подключить
using System.Data;
using System.Data.SQLite;

/// Для существующего соединения pConnect выполняет заданную pCommandText
/// ВОЗВРАЩАЕТ:  System.Data.DataTable
public DataTable returnTable(SQLiteConnection pConnect, string pCommandText)
{ // if (pConnect == null) { ...; return null; }
// if (pCommandText == null) { ...; return null; }

var _dataTable = new DataTable();
try
{ SQLiteCommand _dbCommand = new SQLiteCommand(pCommandText, pConnect);
//if (_dbCommand == null) { ...; return null; }

bool flOpen = false;
// Если соединение, вдруг(!) - не открыто con.State==Closed
if (pConnect.State != ConnectionState.Open) { pConnect.Open(); flOpen = true; }
                                     
using (SQLiteDataReader dr = _dbCommand.ExecuteReader())
{ //if (dr == null) { ...; return null;   }
//if (_dataTable == null) { ...; return null;   }
_dataTable.Load(dr);  //+ Заполняем DataTable
}                 

if (flOpen)
pConnect.Close();

} catch (SQLiteException er)
{   // "Ошибка выполнение запроса:\n["+ er.Message;
return null;   
}   
return _dataTable;
}
+ Благодарностей: 1