Спецы по ADO.Net есть ?

 
+
-
edit
 

timochka

опытный

Проблема в том что не могу через OleDb провайдера приконнектиться к MSDE (движок от Sql Server 7). Нужно именно через OleDb.
 

Igor

втянувшийся
С "SQLOLEDB" никогда не было никаких глобальных проблем.

>не могу

Что не получается-то? Можно подробнее об ошибке?
// Не понимаю, при чем здесь ADO, да еще и Net? :confused:
 

TEvg

аксакал

админ. бан
Могу сказать что ADO.NET - это сон разума.

Я лично предпочитаю СУБД InterBase, дергая его напрямую без ADO и BDE.
 
+
-
edit
 

Voennich

опытный

timochka
>Проблема в том что не могу через OleDb провайдера >приконнектиться к MSDE (движок от Sql Server 7). Нужно именно >через OleDb
наверное стоит подробнее и с кусочком кода
если не справимся то прямая дорога на http://www.aspnetmania.com и rsdn.ru

TEvg
> Могу сказать что ADO.NET - это сон разума.
> Я лично предпочитаю СУБД InterBase, дергая его напрямую без
> ADO и BDE.
кто о чем, а Евгений о снах. не нравится - не кушай
 
+
-
edit
 

timochka

опытный

Voennich>timochka
>>Проблема в том что не могу через OleDb провайдера >приконнектиться к MSDE (движок от Sql Server 7). Нужно именно >через OleDb
Voennich>наверное стоит подробнее и с кусочком кода
Voennich>если не справимся то прямая дорога на http://www.aspnetmania.com и rsdn.ru

Код прост до безобразия. Я сделал прототип который полностью воспроизводит глюк. Все выглядит так как будто соединение благополучно устанавливается. А при попытке вызвать Fill() происходит исключение "Object reference is not set to an instance". Судя по стеку валится все в глубинах Fill(), причем довольно глубоко. Если заменить провайдера на SqlClient то все работает отлично (От закоментарен).

Может я connectionString плохой указываю или еще что-то.

try
{
string connectionStr = "Provider=SQLOLEDB;"
//+ "Integrated security=SSPI;"
+ "Persist Security Info=true;"
+ "Data Source=localhost;"
+ "Initial Catalog=Master;"
+ "User Id='nrstatuser';"
+ "Password='nrstatuser';";

OleDbConnection cn = new OleDbConnection(connectionStr);
cn.Open();
OleDbDataAdapter adapt = new OleDbDataAdapter("select * from sysobjects", cn);

/* //Using SqlClient provider
string connectionStr = "server=(local);"
+ "database=NRSTATDB;"
+ "uid=nrstatuser;"
+ "pwd=nrstatuser;";

SqlConnection cn = new SqlConnection(connectionStr);
cn.Open();
SqlDataAdapter adapt = new SqlDataAdapter("select * from codes", cn);
*/

Console.WriteLine("Database: " + cn.Database);
Console.WriteLine("DataSource: " + cn.DataSource);
Console.WriteLine("Connection: " + cn.State.ToString());
Console.WriteLine("");

DataSet data = new DataSet();
adapt.Fill(data); // Здесь все падает

// тут распечатываем полученную таблицу

cn.Close();
}
catch (Exception e)
{
Console.WriteLine("");
Console.WriteLine("Exception: " + e.Message);
}


[ 11-04-2003: Message edited by: timochka ]
 
+
-
edit
 

Voennich

опытный

>DataSet data = new DataSet();
>adapt.Fill(data, "CODEz"); // Здесь все падает

вопрос можно ??
а кто сказал что в твоем DataAdapter`е есть таблица с именем "CODEz" ?????

Adds or refreshes rows in the DataSet to match those in the data source using the DataSet and DataTable names.

[C#]
public int Fill(
DataSet dataSet,
string srcTable
);

Parameters
dataSet
A DataSet to fill with records and, if necessary, schema.
srcTable
The name of the source table to use for table mapping.

wbr
 
+
-
edit
 

timochka

опытный

>>DataSet data = new DataSet();
>>adapt.Fill(data, "CODEz"); // Здесь все падает

Voennich>вопрос можно ??
Voennich>а кто сказал что в твоем DataAdapter`е есть таблица с именем "CODEz" ?????

На самом деле не работает ни с правильным именем, ни в варианте adapt.Fill(data);

А провайдер SqlClient просто создает таблицу с указанным именем, и честно говоря думал, что так все и должно быть. Т.е. имя "CODEz" - это имя таблицы внутри DataSet корорая будет создана по результатам select'а.
 
+
-
edit
 

Voennich

опытный

хмм может я что то не понимаю но вот полностью абсолютно работающий код :


<%@ Page language="c#"%>
<%@Import namespace="System.Data" %>
<%@Import namespace="System.Data.OleDb" %>
<%@Import namespace="System.Data.SqlClient" %>
<%@Import namespace="System.Web" %>

<html>
<head>
<script runat="server">

void Page_Load()
{
string cmd = "select top 5 id, name from sysobjects";
string strSql = "Data Source=(local);Trusted_Connection=sspi;Persist Security Info=False;User Id=sa;password=123";
SqlConnection cSql = new SqlConnection(strSql);
cSql.Open();
SqlDataAdapter aSql = new SqlDataAdapter(cmd, cSql);
DataSet ds1 = new DataSet();
aSql.Fill(ds1);
dg1.DataSource = ds1.Tables[0];
dg1.DataBind();
cSql.Close();

string strOle = "Provider=SQLOLEDB;"+strSql;
OleDbConnection cOle = new OleDbConnection(strOle);
cOle.Open();
OleDbDataAdapter aOle = new OleDbDataAdapter(cmd, cOle);

DataSet ds2 = new DataSet();
aOle.Fill(ds2);
dg2.DataSource = ds2.Tables[0];
dg2.DataBind();
cOle.Close();



}

</script>
</head>
<BODY>
test
<asp:DataGrid id = "dg1" runat="server">
</asp:DataGrid>


<asp:DataGrid id = "dg2" runat="server">
</asp:DataGrid>

</body>
</html>




на выходе два абсолютно одинаковых DataGrid


Примечание :
подключался к SQLServer 2000 Developer Edition , уж извини но 7го рядом нет
[ 11-04-2003: Message edited by: Voennich ]
 
+
-
edit
 

timochka

опытный

Voennich>хмм может я что то не понимаю но вот полностью абсолютно работающий код :
.......................
Voennich>Примечание :
Voennich>подключался к SQLServer 2000 Developer Edition , уж извини но 7го рядом нет

Ясно. У меня он не идет :-( Видимо дело в 7-м сервере.
Я кстати читал что для 2000-го сервера и для 7-го нужно указывать разные ConnectionString.
 
+
-
edit
 

Voennich

опытный

timochka

хмм
а если посмотреть
1. cOle.State чему оно будет равно ?
2. при ошибки по идее должен вылетать OleDbException - если вылетает то чего в нем написано


TEvg
что именно ужас ?
может покажешь сколько строк у тебя займет подключение к БД и вывод на экран всех данных которые прилетели по запросу ?
 
+
-
edit
 

timochka

опытный

Voennich>timochka
Voennich>нее насколько я понимаю это ты показал просто exception
Voennich>сделай так (в том примере )
Voennich>давай на том примере смотреть
Voennich>поправь его так :

Понял я тебя. Но выпадает System.NullReferenceException, а не OleDbException.


По поводу строки коннекта - это пример из KnowledgeBase 311313
(кусочек выдран)

' Connection string to a SQL Server 7.0.
strCn = "Provider=SQLOLEDB.1;integrated Security=SSPI;Persist Security Info=False;Initial Catalog=pubs;Data Source=mySQL7"

' Connection string to a SQL Server 2000.
' strCn = "Provider=SQLOLEDB.1;User ID=SA;Password=;Initial Catalog=pubs;Data Source=myTestSQL"

Вот такая фигня.
 
+
-
edit
 

Voennich

опытный

>System.NullReferenceException

черт и что же у тебя всетаки null то ?:(
не понимаю

>Connection string to a SQL Server 7.0.
>strCn = "Provider=SQLOLEDB.1;integrated Security=SSPI;Persist >Security Info=False;Initial Catalog=pubs;Data Source=mySQL7"

>' Connection string to a SQL Server 2000.
>' strCn = "Provider=SQLOLEDB.1;User ID=SA;Password=;Initial >Catalog=pubs;Data Source=myTestSQL"

в принципе одно и тоже

в общем какие то глюки по моему

найди SQL Server 2000 проверь будет ли с ним работать
или хотябы Access какой нибудm (строка будет примерно такая
PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=С:DB.mdb;
 
+
-
edit
 

timochka

опытный

Voennich>timochka

Voennich>хмм
Voennich>а если посмотреть
Voennich>1. cOle.State чему оно будет равно ?
Voennich>2. при ошибки по идее должен вылетать OleDbException - если вылетает то чего в нем написано

cOle.State.ToString() => "Open"

Вот какое исключение падает.

Exception: Object reference not set to an instance of an object.

Source ------
System.Data

Stack ------
at System.Data.Common.IRowset.GetNextRows(IntPtr hChapter, Int32 lRowsOffset, Int32 cRows, Int32& pcRowsObtained, IntPtr& pprghRows)
at System.Data.OleDb.OleDbDataReader.GetRowHandles()
at System.Data.OleDb.OleDbDataReader.ReadRowset()
at System.Data.OleDb.OleDbDataReader.Read()
at System.Data.Common.DbDataAdapter.FillLoadDataRow(SchemaMapping mapping)
at System.Data.Common.DbDataAdapter.FillFromReader(Object data, String srcTable, IDataReader dataReader, Int32 startRecord, Int32 maxRecords, DataColumn parentChapterColumn, Object parentChapterValue)
at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, String srcTable, IDataReader dataReader, Int32 startRecord, Int32 maxRecords)
at System.Data.Common.DbDataAdapter.Fill(Object data, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)

at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, String srcTable)
at DataBaseProto.Class1.Main(String[] args) in c:timdatabaseprotomain.cs:line 50
 
+
-
edit
 

Voennich

опытный

TEvg
>Я так не програмлю
а как программишь ? :-)

timochka
нее насколько я понимаю это ты показал просто exception
сделай так (в том примере )
давай на том примере смотреть
поправь его так :

try
{
aOle.Fill(ds2);
}
catch(OleDbException e )
{
errL.Text = "code:" + e.ErrorCode + "full line:" + e.ToString();
}
catch(exception e)
{
errL.Text = "general exception" + e.ToString();
}

...

<asp:Label id="errL" runat="server"/>



чего выдаст ?

кстати я тут поговорил со своим админом БД по его мнению строка соединения для SQL 7 и для 2к в общем случае не считая мелочей одна и та же


[ 11-04-2003: Message edited by: Voennich ]
 
RU Victor Blinov #12.04.2003 05:31
+
-
edit
 

Victor Blinov

опытный

TEvg>Я так не програмлю!
:D
"Будьте самоучками - не ждите, чтобы вас научила жизнь." С.Е. Лец  
+
-
edit
 

timochka

опытный

>>System.NullReferenceException

Voennich>черт и что же у тебя всетаки null то ?:(
Voennich>не понимаю

Voennich>в общем какие то глюки по моему

Voennich>найди SQL Server 2000 проверь будет ли с ним работать
Voennich>или хотябы Access какой нибудm (строка будет примерно такая
Voennich>PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=С:DB.mdb;

Я тоже понимаю что глюк. Судя по стеку глюк глубоко в недрах.

К счастью удалось уболтать заказчика что с MSDE мы будем работать через SqlClient
 
+
-
edit
 

Voennich

опытный

timochka

>Я тоже понимаю что глюк. Судя по стеку глюк глубоко в недрах.

>К счастью удалось уболтать заказчика что с MSDE мы будем работать через SqlClient

1. а чего он сопротивлялся ? через SqlClient по утверждению MS и независымым тестам намного быстрее чем чере OLEDB

2. с глюком лучше все таки разобраться

3. кстати а чего MSDE На движке от SQL7 по моему есть на 2k в "свободном" доступе
например
тут
правда 70 Мб :-)
 
+
-
edit
 

timochka

опытный

Voennich>timochka

>>К счастью удалось уболтать заказчика что с MSDE мы будем работать через SqlClient

Voennich>1. а чего он сопротивлялся ? через SqlClient по утверждению MS и независымым тестам намного быстрее чем чере OLEDB

Считалось что так проще будет менять один DB engine на другой.
Внешние интерфейсы модуля от реализации базы данных не зависят.

Voennich>2. с глюком лучше все таки разобраться
Поиск по инету дал такие результаты. Все упоминания либо OLEDB на 2к сервере, либо SqlClient.

Voennich>3. кстати а чего MSDE На движке от SQL7 по моему есть на 2k в "свободном" доступе
Voennich>правда 70 Мб :-)
Поэтому и не стал его искать. У меня уже был движок от 7-го сервера и я решил не мучиться.

В общем проблема решилась путем убалтывания заказчика.
 

в начало страницы | новое
 
Поиск
Настройки
Твиттер сайта
Статистика
Рейтинг@Mail.ru