Как я создаю базу данных Microsoft Jet (Access) без interop блока?

Как вы обнаружили, черепаха Screen является луком многих слоев. Есть две проблемы, которые нам нужно решить: класс _Screen вызывает его инициализатор super (TurtleScreen's) таким образом, который не подходит для подкласса; функция Screen() вызывается из множества мест и жестко определяет, какой класс создает экран. Итак, давайте рассмотрим обе проблемы:

import turtle

class MyScreen(turtle._Screen):
    def __init__(self):
        super().__init__()
        turtle.TurtleScreen.__init__(self, MyScreen._canvas)

        self.setup(500, 500)
        self.screensize(1000, 1000)
        self.title("Title")
        self.bgcolor("black")

def MyScreenFunction():
    if turtle.Turtle._screen is None:
        turtle.Turtle._screen = MyScreen()
    return turtle.Turtle._screen

turtle.Screen = MyScreenFunction

class MyTurtle(turtle.Turtle):
    def __init__(self):
        super().__init__(shape="circle")

wn = turtle.Screen()

tortoise = MyTurtle()
tortoise.color('white')

tortoise.circle(100)

wn.mainloop()

Однако, может быть, есть лучший путь. Черепаха может использоваться как в автономном режиме , как описано выше, так и в , встроенном в программу tkinter. встроенный подход использует RawTurtle, TurtleScreen и, необязательно, Scrolled Canvas. Эти классы легче подклассить, и лучшим подходом может быть создание собственного эквивалента автономной черепахи путем внедрения черепах в tkinter и создания подклассов по мере необходимости.

5
задан Mitch Wheat 29 April 2011 в 06:25
поделиться

4 ответа

Прежде чем я выброшу этот код, он мог бы также жить на stackoverflow

Что-то вдоль этих строк, кажется, добивается цели:

if (!File.Exists(DB_FILENAME))
{
    var cnnStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + DB_FILENAME;

    // Use a late bound COM object to create a new catalog. This is so we avoid an interop assembly. 
    var catType = Type.GetTypeFromProgID("ADOX.Catalog");
    object o = Activator.CreateInstance(catType);
    catType.InvokeMember("Create", BindingFlags.InvokeMethod, null, o, new object[] {cnnStr});

    OleDbConnection cnn = new OleDbConnection(cnnStr);
    cnn.Open();
    var cmd = cnn.CreateCommand();
    cmd.CommandText = "CREATE TABLE VideoPosition (filename TEXT , pos LONG)";
    cmd.ExecuteNonQuery();

}

Этот код иллюстрирует, что можно получить доступ к использованию базы данных OleDbConnection однажды его созданный с COM-компонентом ADOX.Catalog.

10
ответ дан 13 December 2019 в 19:39
поделиться

Я сделал то же как Autsin, создаю дб Доступа, затем включал его в мой проект как управляемый ресурс. Однажды там, это включено в скомпилированный код, и можно скопировать его в жесткий диск так много раз, как Вы хотите. Пустые базы данных являются относительно маленькими также, таким образом, там не является много служебным.

Добавленная премия является способностью настроить базу данных, если Вы знаете, как она будет использоваться или какие таблицы будут добавлены каждый раз, когда можно уменьшить объем кодирования и замедлить запросы базы данных.

1
ответ дан 13 December 2019 в 19:39
поделиться

Вам не нужна Струя (сильная головная боль) установленный при использовании этой строки подключения в .net 3.5

Provider=Microsoft.ACE.OLEDB.12.0;Data
Source=C:\myFolder\myAccess2007file.accdb;Persist
Security Info=False;

Это должно работать над доступом 2007 и ниже

0
ответ дан 13 December 2019 в 19:39
поделиться

Интересный вопрос - я никогда не думал для создания одного динамического как это. Я всегда включал свою базовую базу данных как ресурс в проекте и делал копию, когда мне был нужен новый.

0
ответ дан 13 December 2019 в 19:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: