C# и база геоданных

0 голосов
спросил 07 Окт, 14 от REDMAX (320 баллов) в категории Программные продукты Esri
Как подключиться к базам геоданных в C#(Visual Studio 2013)?
con = new OleDbConnection("Provider=LCPI.IBProvider;" +
"data source=c:\\tmp\\tm.gdb;" +
"ctype=win1251;user id=user;password=password");
con.Open();
con.Close();

в таком виде не подключается, ругается на провайдера, при попытке открыть(con.Open()) подскажите как можно подключиться к ним каким либо другим способом или какого провайдера поставить(IBProvider только под VS 2008 )?

8 Ответы

0 голосов
ответил 07 Окт, 14 от Grigoriy (127,020 баллов)
Для начала Вам нужно понять, что такое база геоданных.
И какие они бывают.
Потом определиться какой набор инструментов у Вас есть, и что Вы разрабатываете.
А подключаться как-то так:
Connecting to geodatabases and databases
0 голосов
ответил 07 Окт, 14 от REDMAX (320 баллов)
У меня есть: VS 2013, ArcGis 10 Desktop, ArcGis Runtime SDK .Net 10.2
нужно написать программу, которая будет:
1) считывать .gbd(2 и более)
2) сканировать их на предмет совпадении с условием фильтра( к примеру: нужны только те базы данных которые имеют данные о населенных пунктах, т.е. в одной из таблиц имеется столбец "Населенные пункты" )
3) объединить подходящие под условия .gbd в одну
что посоветуете?
0 голосов
ответил 07 Окт, 14 от Grigoriy (127,020 баллов)
1. Выполнить требуемуюзадачунад двумя".gbd"руками.
2. Потом написатьмодель илискрипт:
http://resources.arcgis.com/ru/help/main/10.2/002w/002w00000001000000.htm
http://resources.arcgis.com/ru/help/main/10.2/000v/000v000000v7000000.htm
3. Скрипт можно оформить в виде инструмента:
http://resources.arcgis.com/ru/help/main/10.2/0015/001500000001000000.htm
4. Когда всё это получится, можно подумать о написании инструмента или "расширения" на c#.
http://resources.arcgis.com/en/help/arcobjects-net/conceptualhelp/0001/0001000000w2000000.htm
http://resources.arcgis.com/en/help/arcobjects-net/conceptualhelp/0001/0001000000p1000000.htm
0 голосов
ответил 18 Окт, 14 от REDMAX (320 баллов)
написал кое-что, программу которая реализует мои требования, пока код очень сырой, много чего лишнего. но реализует все с пользовательскими базами данных (.mdb)
по вашему совету пытался написать скрипт на python, ничего хорошего не вышло. для меня это не подходящий вариант.
перечитал много страниц help'a arcgis. так и не смог разобраться с тем как мне работать с gbd. тот же openfiledialog реализовать не выходит для gbd. выкладываю код, может вы мне подскажете как мне так же реализовать программу под gbd:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using ADOX;
using System.Data.OleDb;
namespace _2_Course_Work
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
OleDbConnection DBConn;
OpenFileDialog openfiledialog;
OleDbDataAdapter adapter;
DataSet ds;
OleDbCommand command;
int vtable = 0; //количество таблиц, которые совпали
string NTName = "NewTableName"; //Название новой таблицы
private void button1_Click(object sender, EventArgs e)
{
ADOX.Catalog cat = new ADOX.Catalog();
cat.Create("Provider=Microsoft.Jet.OLEDB.4.0;" +
"Data Source=D:\\NewMDB.mdb;" +
"Jet OLEDB:Engine Type=5");
cat = null;
}
private void button2_Click(object sender, EventArgs e)
{
openfiledialog = new OpenFileDialog();
openfiledialog.Filter = "DataBase (*.mdb; *.accdb)|*.mdb; *.accdb;";
openfiledialog.Multiselect = true;
comboBox1.Items.Clear();
if (openfiledialog.ShowDialog() == DialogResult.OK)
{
foreach (String file in openfiledialog.FileNames)
{
DBConn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + file);
DBConn.Open();
DataTable datatable = DBConn.GetSchema("Tables", new string[] { null, null, null, "TABLE" });
foreach (DataRow row in datatable.Rows)
{
string TableName = row["TABLE_NAME"].ToString();
comboBox1.Items.Add(TableName+","+file);
}
// OleDbCommand com = new OleDbCommand("CREATE TABLE Результаты (номер COUNTER CONSTRAINT номер PRIMARY KEY,Тема STRING, Дата string ,Группа STRING, Студент STRING ,Верных_ответов STRING,Результат STRING )", DBConn);
// com.ExecuteNonQuery();
DBConn.Close();
}
}
}
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
var param = comboBox1.SelectedItem.ToString().Split(',');
DBConn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + param[1]);
DBConn.Open();
adapter = new OleDbDataAdapter(@"SELECT * FROM " + param[0], DBConn);
DataTable datatable1 = new DataTable();
adapter.Fill(datatable1);
ds = new DataSet();
ds.Tables.Add(datatable1);

/*DataRow row = datatable1.NewRow();
row["Город"] = "Artem";
datatable1.Rows.Add(row);*/
dataGridView1.DataSource = datatable1;
// MessageBox.Show(dataGridView1.Columns[2].HeaderText);
DBConn.Close();
}
private void button3_Click(object sender, EventArgs e)
{
//DBConn.Open();

//adapter.Update(ds.Tables[0]);
//UpdateBD(comboBox1.SelectedItem.ToString(), "Город", "УФА");
// DBConn.Close();
OleDbConnection NewDB = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\NewMDB.mdb");
NewDB.Open();
OleDbCommand command = NewDB.CreateCommand();
command.CommandText = "INSERT INTO Города (КодГорода) VALUES (?)";
command.Parameters.Add("", OleDbType.Char).Value = "56";
/*string ct = "INSERT INTO Города1 (КодГорода, Город, КодСтраны) VALUES (32, ГЫТЫА, 123)";
OleDbCommand com = new OleDbCommand(ct, NewDB);*/
command.ExecuteNonQuery();
NewDB.Close();
}
private void UpdateBD(string tablename, string colmn, string value,int r,OleDbConnection c)
{
adapter = new OleDbDataAdapter("select * from " + tablename,c);
OleDbCommandBuilder cb = new OleDbCommandBuilder(adapter);
ds = new DataSet();
adapter.Fill(ds,tablename);
ds.Tables[0].Rows[r][colmn] = value;
adapter.Update(ds,tablename);
}
private void InsertBD(string tablename, string colmn,string type, string value, string direct)
{
OleDbConnection NewDB = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source="+direct);
NewDB.Open();
OleDbCommand command = NewDB.CreateCommand();
string v ="";
var param = value.Split(',');
for (int t = 0; t < param.Length; t++)
{
v += "?,";
}
command.CommandText = "INSERT INTO "+tablename+" ("+colmn+") VALUES ("+v.TrimEnd(',',' ')+")";
for (int t = 0; t < param.Length; t++)
{
command.Parameters.Add("", OleDbType.Char).Value = param[t];
}
// MessageBox.Show(command.CommandText);
/*if (type == "Integer") command.Parameters.Add("", OleDbType.Integer).Value = value;
else */
//command.Parameters.Add("", OleDbType.Char).Value = value;

command.ExecuteNonQuery();
NewDB.Close();
}
private void button4_Click(object sender, EventArgs e)
{
foreach (String file in openfiledialog.FileNames)
{
DBConn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + file);
DBConn.Open();
DataTable datatable = DBConn.GetSchema("Tables", new string[] { null, null, null, "TABLE" });
foreach (DataRow row in datatable.Rows)
{
string TableName = row["TABLE_NAME"].ToString();
if (vtable == 0) NTName = TableName;
adapter = new OleDbDataAdapter(@"SELECT * FROM " + TableName, DBConn);
DataTable datatable1 = new DataTable();
adapter.Fill(datatable1);
ds = new DataSet();
ds.Tables.Add(datatable1);
dataGridView1.DataSource = datatable1;
for (int i = 0; i < dataGridView1.ColumnCount; i++)
{
if (dataGridView1.Columns.HeaderText == SClmn.Text)
{
string type;
OleDbConnection NewDB = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\NewMDB.mdb");
NewDB.Open();
if (vtable == 0)
{
0 голосов
ответил 18 Окт, 14 от REDMAX (320 баллов)
если я поставлю SQL Server Express(или другую СУБД поддерживающее подключение к gbd) смогу ли я выполнить подключение как в коде выше?
0 голосов
ответил 18 Окт, 14 от REDMAX (320 баллов)
и есть ли какие нибудь альтернативы openfiledialog у ArcObject?
0 голосов
ответил 18 Окт, 14 от REDMAX (320 баллов)
если поставить postgresql в связке с postgis можно ли будет из c# sql запросами обращаnься к базам gbd?
0 голосов
ответил 28 Окт, 14 от Grigoriy (127,020 баллов)
Ещё раз:
http://resources.arcgis.com/en/help/arcobjects-net/conceptualhelp/0001/0001000003s8000000.htm
http://resources.arcgis.com/en/help/arcobjects-net/conceptualhelp/0001/0001000000t5000000.htm

если поставить postgresql в связке с postgis можно ли будет из c# sql запросами обращаnься к базам gbd?

Можно, только придется учить "postgresql в связке с postgis".
И тогда зачем Вам ArcGIS?
Можно и из ArcGIS обращаться напрямую к postgresql и к SQL Server Express и к Oracle.
И выполнять sql-команды.
Только нужно сначала просто учиться.
Добро пожаловать на сайт Вопросов и Ответов, где вы можете задавать вопросы по GIS тематике и получать ответы от других членов сообщества.
...