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
Здравствуйте, 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>Почему?
Похоже на отсутствие оледенения с СУБД.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Flem1234, Вы писали:
F>Здравствуйте, VladD2, Вы писали:
VD>>Компилятор собран с исходников или инсталлирован?
F>Инсталирован. Как можно номер билда посмотреть?
Посмотреть версию сборки Nemerle.dll из каталога в который был проинсталлирован Nemerle.
Только отлаживать инсталлированную версию не просто.
У меня под рукой SQL-сервера нет. Так что проверить сейчас не могу.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Посмотреть версию сборки Nemerle.dll из каталога в который был проинсталлирован Nemerle. VD>Только отлаживать инсталлированную версию не просто.
Здравствуйте, Flem1234, Вы писали:
F>Nemerle, Version=0.9.4.8438, Culture=neutral, PublicKeyToken=e080a9c724e2bfcd
F>Приду домой, попробую собрать из исходников и запустить
Если соберешь из исходников, то запусти компилятор из под отладчика, скорми ему этот пример через командную строку и поставь перехват указанных тобой исключений. Ну, и место в котором оно появилось с колстеком сюда зашли.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Вообще я не так давно сделал макросы, позволяющие зашивать вызовы 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 методов.
До более-менее приличного ОРМ-а не дотянул — не хватило энтузиазма. Если кого заинтересует могу поделиться кодом.
Здравствуйте, hardcase, Вы писали:
H>Надо указать строку соединения компилятору макросом ConfigureConnection.
По уму макрос нужно допилить, чтобы он проверял наличие верной строки (т.е. строки позволяющей получить соеденение с нужной БД), и если это сделать не удается, выдавать осмысленное сообщение об ошибке с намеком на то, что нужно задать эту строку в макроатрибуте.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, hardcase, Вы писали:
H>Вообще я не так давно сделал макросы, позволяющие зашивать вызовы SQL запросов и хранимых процедур в вызовы обычных методов + поднятие из датаридера простых DTO-объектов.
H>До более-менее приличного ОРМ-а не дотянул — не хватило энтузиазма. Если кого заинтересует могу поделиться кодом.
Здравствуйте, Flem1234, Вы писали:
F>Заинтересовало, делись
Ок, вечерком сделаю примерчики (заодно освежу в памяти возможности). Вообще идея оформить это в виде сниппета мне понравилась, нужно, правда, документацию нарисовать.
Здравствуйте, hardcase, Вы писали:
H>Ок, вечерком сделаю примерчики (заодно освежу в памяти возможности). Вообще идея оформить это в виде сниппета мне понравилась, нужно, правда, документацию нарисовать.
Чтобы добавить снипет тебе нужны права комитера. Для этого нужно обзавестись google-экаунтом и прислать его мне.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Flem1234, Вы писали:
F>Заинтересовало, делись
В общем, поломав голову и с трудом отыскав исходники на собственном SVNе, попутно исправив пару багов выложил всю эту песочницу на родном коднете.
Запускать проект Sample. Пример работы с БД — в файле DbSample.n. Проект hardcase.data содержит макросы реализующие логику этой кухни.
История была такова, что когда-то (еще до официального выхода LINQ и EF-а) я сделал библиотечку напоминающую bltookit, только я использовал для генерирования кода CodeDom а не Emit. Основная фишка была в прозрачном вызове хранимых процедур (без отражения) и кэшировании ответов СУБД.
Полный функционал этот пример, конечно, не отображает, но демонстрирует саму идею. В принципе довести до ума можно, только последнее время я думаю, что нужно отделить маппинг DataReader -> CustomObject в специальную подсистему маппинга (типа AutoMapper или EmitMapper), заодно убъётся еще один заяц — получим самый быстрый в дотнете объектный маппер.
to VladD2: а я с вами на гугле обсуждал дизайн анонимных классов, кстати реализация их тоже в этом проекте валяется (hardcase.macros/atypemacro.n).
Здравствуйте, 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-а удобно будет использовать, и вообще... Плюс ее тоже надо развивать и оптимизировать.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.