2013-07-24 4 views
3

Этот код не работает. Может ли кто-нибудь направить меня туда, где я могу найти примеры создания базы данных Postgresql и таблицы «на лету» с помощью C#?Postgresql - динамически создает базу данных и таблицу

 const string connStr = "Server=localhost;Port=5432; 
          User Id=postgres;Password=enter;Database=postgres"; 

     var m_conn = new NpgsqlConnection(connStr); 

     // creating a database in Postgresql 
     m_createdb_cmd = new NpgsqlCommand("CREATE DATABASE IF NOT EXISTS \"testDb\" " + 
             "WITH OWNER = \"postgres\" " + 
             "ENCODING = 'UTF8' " + 
             "CONNECTION LIMIT = -1;", m_conn); 

     // creating a table in Postgresql 
     m_createtbl_cmd = new NpgsqlCommand(
      "CREATE TABLE MyTable(CompanyName VARCHAR(150))"; 

     m_conn.Open(); 
     m_createdb_cmd.ExecuteNonQuery(); 
     m_createtbl_cmd.Connection = m_conn; 
     m_conn.Close(); 

db создан, но я получаю молчащий отказ при создании таблицы.

ответ

0

Решение:

// 1. Connect to server to create database: 
    const string connStr = "Server=localhost;Port=5432;User Id=postgres;Password=enter;"; 

    // 2. Connect to server to create table: 
    const string connStr2 = "Server=localhost;Port=5432;User Id=postgres;Password=enter;Database=testDb"; 


    var m_conn = new NpgsqlConnection(connStr); // db connction 
    var m_conn2 = new NpgsqlConnection(connStr2); // table connection 

    // creating a database in Postgresql 
    m_createdb_cmd = new NpgsqlCommand("CREATE DATABASE IF NOT EXISTS \"testDb\" " + 
            "WITH OWNER = \"postgres\" " + 
            "ENCODING = 'UTF8' " + 
            "CONNECTION LIMIT = -1;", m_conn); 

    // creating a table in Postgresql 
    m_createtbl_cmd = new NpgsqlCommand 
     { 
     CommandText ="CREATE TABLE table1(ID CHAR(256) CONSTRAINT id PRIMARY KEY, Title CHAR)" 
     }; 

     m_createtbl_cmd.Connection = m_conn2; 

// 3.. Make connection and create 

     // open connection to create DB 
     m_conn.Open(); 
     m_createdb_cmd.ExecuteNonQuery(); 
     m_conn.Close(); 

     // open connection to create table 
     m_conn2.Open(); 
     m_createtbl_cmd.ExecuteNonQuery(); 
     m_conn2.Close(); 

Это работает, но есть более короткий путь, чтобы сделать это? Мне пришлось создать два соединения Npgsql. Я не знаю, просто не выглядит очень элегантно для меня.

4

Я хотел бы сделать это:

string connStr = "Server=localhost;Port=5432;User Id=postgres;Password=enter;"; 
var m_conn = new NpgsqlConnection(connStr); 
var m_createdb_cmd = new NpgsqlCommand(@" 
    CREATE DATABASE IF NOT EXISTS testDb 
    WITH OWNER = postgres 
    ENCODING = 'UTF8' 
    CONNECTION LIMIT = -1; 
    ", m_conn); 
m_conn.Open(); 
m_createdb_cmd.ExecuteNonQuery(); 
m_conn.Close(); 

connStr = "Server=localhost;Port=5432;User Id=postgres;Password=enter;Database=testDb"; 
m_conn = new NpgsqlConnection(connStr); 
m_createtbl_cmd = new NpgsqlCommand(
    "CREATE TABLE table1(ID CHAR(256) CONSTRAINT id PRIMARY KEY, Title CHAR)" 
    , m_conn); 
m_conn.Open(); 
m_createtbl_cmd.ExecuteNonQuery(); 
m_conn.Close(); 

Использование var здесь не рекомендуется. Я использовал его, поскольку я не знаю, какие возвращаемые типы, но вы должны.

Обратите внимание на использование необработанной строки (@). Это упрощает построение строк.

Не используйте идентификаторы, окруженные двойными кавычками в Postgresql, если этот идентификатор не является незаконным. Это сделает вашу жизнь намного сложнее.

1

кажется, что вы просто забыли вызвать ExecuteNonQuery метод m_createtbl_cmd:

m_createtbl_cmd.ExecuteNonQuery(); 

Кроме того, вы можете упростить его, используя библиотеку DynORM: http://dynorm.codeplex.com/

Надеется, что это помогает!

0

Это то, что работает для меня, чтобы проверить наличие какой-либо базы данных Postgres с C#:

private bool chkDBExists(string connectionStr, string dbname) 
{ 
    using (NpgsqlConnection conn = new NpgsqlConnection(connectionStr)) 
    { 
     using (NpgsqlCommand command = new NpgsqlCommand 
      ($"SELECT DATNAME FROM pg_catalog.pg_database WHERE DATNAME = '{dbname}'", conn)) 
     { 
      try 
      { 
       conn.Open(); 
       var i = command.ExecuteScalar(); 
       conn.Close(); 
       if (i.ToString().Equals(dbname)) //always 'true' (if it exists) or 'null' (if it doesn't) 
        return true; 
       else return false; 
      } 
      catch (Exception e) { return false; } 
     } 
    } 
} 

** Условный используется в операторе примерки поймать можно просто проверить, если возвращение ExecuteScalar равна нулю для несуществующего DB и not-null, если он существует.

Смежные вопросы