sql macro error
От: Flem1234  
Дата: 12.01.10 15:48
Оценка:
Этот код:
using System;
using System.Console;
using Nemerle.Utility;
using Nemerle.Data;
using System.Data.SqlClient;

module Program
{
  Main() : void
  {
    def c = SqlConnection("Data Source=dev-w;Initial Catalog=Northwind;Integrated Security=True");
    c.Open();
    ExecuteReaderLoop ("select CustomerID from Customers", c, 
        { WriteLine("test"); });
  }
}


не компилируется

Error    1    KeyNotFoundException has occurred when expanding macro 'ExecuteReaderLoop'    
Error    2    KeyNotFoundException has occurred when expanding macro 'ExecuteReaderLoop'    
Error    3    the meaning of `ExecuteReaderLoop' does not allow this operation    
Error    4    KeyNotFoundException has occurred when expanding macro 'ExecuteReaderLoop'    
Error    5    the meaning of `ExecuteReaderLoop' does not allow this operation


Почему?
Re: sql macro error
От: VladD2 Российская Империя www.nemerle.org
Дата: 12.01.10 16:01
Оценка:
Здравствуйте, Flem1234, Вы писали:

F>не компилируется


F>
F>Error    1    KeyNotFoundException has occurred when expanding macro 'ExecuteReaderLoop'    
F>Error    2    KeyNotFoundException has occurred when expanding macro 'ExecuteReaderLoop'    
F>Error    3    the meaning of `ExecuteReaderLoop' does not allow this operation    
F>Error    4    KeyNotFoundException has occurred when expanding macro 'ExecuteReaderLoop'    
F>Error    5    the meaning of `ExecuteReaderLoop' does not allow this operation    
F>


F>Почему?


Похоже на отсутствие оледенения с СУБД.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: sql macro error
От: VladD2 Российская Империя www.nemerle.org
Дата: 12.01.10 16:01
Оценка:
... Точнее не то, что БД не верная или ее нет вообще.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: sql macro error
От: Flem1234  
Дата: 12.01.10 16:25
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>... Точнее не то, что БД не верная или ее нет вообще.

using System;
using System.Console;
using Nemerle.Utility;
using Nemerle.Data;
using System.Data.SqlClient;

module Program
{
  Main() : void
  {
    def c = SqlConnection("Data Source=dev-w;Initial Catalog=Northwind;Integrated Security=True");
    //ExecuteReaderLoop ("select CustomerID from Customers", c, 
    //    { WriteLine("test"); });
    
    c.Open();
    def command = c.CreateCommand();
    command.CommandText = "select CustomerID from Customers";
    def reader = command.ExecuteReader();
    while( reader.Read())
    {
        WriteLine("yes");
    }
    
  }
}


Такой код отрабатывает. Много yes. То есть база реально есть.
Re[3]: sql macro error
От: VladD2 Российская Империя www.nemerle.org
Дата: 12.01.10 16:40
Оценка:
Здравствуйте, Flem1234, Вы писали:

F>Такой код отрабатывает. Много yes. То есть база реально есть.


Компилятор собран с исходников или инсталлирован?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: sql macro error
От: Flem1234  
Дата: 12.01.10 16:44
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Компилятор собран с исходников или инсталлирован?


Инсталирован. Как можно номер билда посмотреть?
Re[5]: sql macro error
От: VladD2 Российская Империя www.nemerle.org
Дата: 12.01.10 16:52
Оценка:
Здравствуйте, Flem1234, Вы писали:

F>Здравствуйте, VladD2, Вы писали:


VD>>Компилятор собран с исходников или инсталлирован?


F>Инсталирован. Как можно номер билда посмотреть?


Посмотреть версию сборки Nemerle.dll из каталога в который был проинсталлирован Nemerle.
Только отлаживать инсталлированную версию не просто.

У меня под рукой SQL-сервера нет. Так что проверить сейчас не могу.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: sql macro error
От: Flem1234  
Дата: 12.01.10 16:55
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Посмотреть версию сборки Nemerle.dll из каталога в который был проинсталлирован Nemerle.

VD>Только отлаживать инсталлированную версию не просто.

Nemerle, Version=0.9.4.8438, Culture=neutral, PublicKeyToken=e080a9c724e2bfcd

Приду домой, попробую собрать из исходников и запустить
Re[7]: sql macro error
От: VladD2 Российская Империя www.nemerle.org
Дата: 12.01.10 16:58
Оценка:
Здравствуйте, Flem1234, Вы писали:

F>Nemerle, Version=0.9.4.8438, Culture=neutral, PublicKeyToken=e080a9c724e2bfcd


F>Приду домой, попробую собрать из исходников и запустить


Если соберешь из исходников, то запусти компилятор из под отладчика, скорми ему этот пример через командную строку и поставь перехват указанных тобой исключений. Ну, и место в котором оно появилось с колстеком сюда зашли.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: sql macro error
От: hardcase Пират http://nemerle.org
Дата: 12.01.10 20:30
Оценка: 44 (2)
Здравствуйте, Flem1234, Вы писали:

F>Этот код

F>не компилируется
F>Почему?

Надо указать строку соединения компилятору макросом ConfigureConnection.

using System;
using System.Console;
using Nemerle.Utility;
using Nemerle.Data;
using System.Data.SqlClient;

[assembly:ConfigureConnection("System.Data.SqlClient.SqlConnection", @"Data Source=.\sqlexpress;Initial Catalog=myDatabase;Integrated Security=True", "mydb")]

module Program
{
  Main() : void
  {
    def dbcon = SqlConnection(@"Data Source=.\sqlexpress;Initial Catalog=myDatabase;Integrated Security=True");
    dbcon.Open();
    ExecuteReaderLoop("SELECT id FROM myTable", dbcon, 
        {
            WriteLine(id)
        }, "mydb");
  }
}
/* иЗвиНите зА неРовнЫй поЧерК */
Re[2]: sql macro error
От: hardcase Пират http://nemerle.org
Дата: 12.01.10 20:43
Оценка:
Вообще я не так давно сделал макросы, позволяющие зашивать вызовы SQL запросов и хранимых процедур в вызовы обычных методов + поднятие из датаридера простых DTO-объектов.
В целом выглядит в таком духе:
    [DataEntry]
    public class DataObject {
       [DataField, Accessor]
       private mutable a : string;

       [DataField, Accessor]
       private mutable b : string;
    }

    public module DAL {

        mutable con : OleDbConnection = null;

        private CreateDbCommand() : OleDbCommand {
            OleDbCommand("", con);
        }

        private CreateDbParameter() : OleDbParameter {
            OleDbParameter()
        }

        [SqlCommand("INSERT INTO myTable (a, b) VALUES ( @a, @b )")]
        public AddData(a : string, b : string) : void { }

        [SqlCommand("SELECT a, b FROM myTable")]
        public ListData() : IEnumerable[DataObject] { }
    }

Поддерживаются ref-out параметры, можно задавать собственные мапперы типов, DataEntry-объекты могут наследоваться, в т.ч. из разных сборок.
Инфраструктура SQL-макросов требует существование только CreateDbCommand и CreateDbParameter методов.

До более-менее приличного ОРМ-а не дотянул — не хватило энтузиазма. Если кого заинтересует могу поделиться кодом.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[2]: sql macro error
От: VladD2 Российская Империя www.nemerle.org
Дата: 12.01.10 21:33
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Надо указать строку соединения компилятору макросом ConfigureConnection.


По уму макрос нужно допилить, чтобы он проверял наличие верной строки (т.е. строки позволяющей получить соеденение с нужной БД), и если это сделать не удается, выдавать осмысленное сообщение об ошибке с намеком на то, что нужно задать эту строку в макроатрибуте.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: sql macro error
От: VladD2 Российская Империя www.nemerle.org
Дата: 12.01.10 21:34
Оценка:
Здравствуйте, hardcase, Вы писали:

Лучше заложи свой проект в снипеты: http://nemerle.googlecode.com/svn/nemerle/trunk/snippets

Тогда он будет доступен всем желающим и возможно кто-то захочет его доделать.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: sql macro error
От: Flem1234  
Дата: 14.01.10 10:11
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Вообще я не так давно сделал макросы, позволяющие зашивать вызовы SQL запросов и хранимых процедур в вызовы обычных методов + поднятие из датаридера простых DTO-объектов.


H>До более-менее приличного ОРМ-а не дотянул — не хватило энтузиазма. Если кого заинтересует могу поделиться кодом.


Заинтересовало, делись
Re[4]: sql macro error
От: hardcase Пират http://nemerle.org
Дата: 14.01.10 12:22
Оценка:
Здравствуйте, Flem1234, Вы писали:

F>Заинтересовало, делись


Ок, вечерком сделаю примерчики (заодно освежу в памяти возможности). Вообще идея оформить это в виде сниппета мне понравилась, нужно, правда, документацию нарисовать.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[5]: sql macro error
От: VladD2 Российская Империя www.nemerle.org
Дата: 14.01.10 13:40
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Ок, вечерком сделаю примерчики (заодно освежу в памяти возможности). Вообще идея оформить это в виде сниппета мне понравилась, нужно, правда, документацию нарисовать.


Чтобы добавить снипет тебе нужны права комитера. Для этого нужно обзавестись google-экаунтом и прислать его мне.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: sql macro error
От: hardcase Пират http://nemerle.org
Дата: 18.01.10 11:35
Оценка: 183 (3)
Здравствуйте, Flem1234, Вы писали:

F>Заинтересовало, делись


В общем, поломав голову и с трудом отыскав исходники на собственном SVNе, попутно исправив пару багов выложил всю эту песочницу на родном коднете.

Запускать проект Sample. Пример работы с БД — в файле DbSample.n. Проект hardcase.data содержит макросы реализующие логику этой кухни.
История была такова, что когда-то (еще до официального выхода LINQ и EF-а) я сделал библиотечку напоминающую bltookit, только я использовал для генерирования кода CodeDom а не Emit. Основная фишка была в прозрачном вызове хранимых процедур (без отражения) и кэшировании ответов СУБД.
Полный функционал этот пример, конечно, не отображает, но демонстрирует саму идею. В принципе довести до ума можно, только последнее время я думаю, что нужно отделить маппинг DataReader -> CustomObject в специальную подсистему маппинга (типа AutoMapper или EmitMapper), заодно убъётся еще один заяц — получим самый быстрый в дотнете объектный маппер.

to VladD2: а я с вами на гугле обсуждал дизайн анонимных классов, кстати реализация их тоже в этом проекте валяется (hardcase.macros/atypemacro.n).
/* иЗвиНите зА неРовнЫй поЧерК */
Re[5]: sql macro error
От: VladD2 Российская Империя www.nemerle.org
Дата: 18.01.10 18:14
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Здравствуйте, Flem1234, Вы писали:


F>>Заинтересовало, делись


H>В общем, поломав голову и с трудом отыскав исходники на собственном SVNе, попутно исправив пару багов выложил всю эту песочницу на родном коднете.


А зачем же на каком-то там коднете? У Nemerle есть свой SVN. Туда и нужно класть. А то ведь через два месяца ты и сам не вспомнишь где код лежит.

Давай как добавим тебя в список комитеров Nemerle и ты зальешь код в снипеты

H>В принципе довести до ума можно, только последнее время я думаю, что нужно отделить маппинг DataReader -> CustomObject в специальную подсистему маппинга (типа AutoMapper или EmitMapper), заодно убъётся еще один заяц — получим самый быстрый в дотнете объектный маппер.


Абсолютно согласен! Более того. Его функционал со временем можно будет развить. Ведь возможности макросов куда шире нежели каких-то там генерилок MSIL-а. И писать/отлаживать их несравненно проще.

H>to VladD2: а я с вами на гугле обсуждал дизайн анонимных классов, кстати реализация их тоже в этом проекте валяется (hardcase.macros/atypemacro.n).


Так, тем более нужно переносить в SVN Nemerle. Фича вроде анонимных типов должна быть единая и лежать в стандартной библиотеке Nemerle, так как ее и из LINQ-а удобно будет использовать, и вообще... Плюс ее тоже надо развивать и оптимизировать.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.