NANDKUMAR GAIKWAD Ответов: 1

Создание схемы таблицы SQL server из базы данных tally во время выполнения в asp.net с помощью c# DataTable


string source = "PORT=9000;DRIVER=Tally ODBC Driver;SERVER={(local)}";
            OdbcConnection con = new OdbcConnection(source);
            con.Open();
            DataTable dt = new DataTable();
            string[] restrictions = new string[1];
            dt = con.GetSchema("Tables");
            Database db = new Database();

            DropDownList1.DataSource = dt;
            DropDownList1.DataTextField = "Table_Name";
            DropDownList1.DataValueField = "Table_Name";
            DropDownList1.DataBind();

я получаю схему tally из этого, но я хочу использовать эту схему и создать базу данных в sql server 2008 с помощью,
пожалуйста помогите мне,
если мой вопрос не является пониманием, тогда спросите меня снова.
спасибо.

1 Ответов

Рейтинг:
10

Manas_Kumar

Шаг 1: Создайте статический метод, который будет принимать datatable в качестве параметра и извлекать все coulmns, его тип данных. Затем он генерирует sql quries. Вот этот метод:

public static string CreateTABLE(DataTable table)
{
    string sqlQuery;
    sqlQuery = "CREATE TABLE " + table.TableName + "(";
    for (int i = 0; i < table.Columns.Count; i++)
    {
        sqlQuery += "\n [" + table.Columns[i].ColumnName + "] ";
        string columnType = table.Columns[i].DataType.ToString();

        // You will get different data type in  C#(you need to change it SQLServer):Boolean,Byte,Char,DateTime,Decimal,Double,Int16,Int32,Int64,SByte,Single, String,TimeSpan,UInt16,UInt32,UInt64
        switch (columnType)
        {
            case "System.Int32":
                sqlQuery += " int ";
                break;
            case "System.Int64":
                sqlQuery += " bigint ";
                break;
            case "System.Int16":
                sqlQuery += " tinyint ";
                break;
            case "System.Decimal":
                sqlQuery += " decimal ";
                break;
            case "System.DateTime":
                sqlQuery += " datetime ";
                break;
            case "System.String":
            default:
                sqlQuery += string.Format(" nvarchar({0}) ", table.Columns[i].MaxLength == -1 ? "max" : table.Columns[i].MaxLength.ToString());
                break;
        }

        if (table.Columns[i].AutoIncrement)
            sqlQuery  += " IDENTITY(" + table.Columns[i].AutoIncrementSeed.ToString() + "," + table.Columns[i].AutoIncrementStep.ToString() + ") ";

        if (!table.Columns[i].AllowDBNull)
            sqlQuery += " NOT NULL ";
        sqlQuery += ",";
    }

    return sqlQuery.Substring(0, sqlQuery.Length-1) + "\n)";
}

// Call the method
DataTable yourDataTableObj = new DataTable();
string sqlQuery = CreateTABLE(yourDataTableObj);

Шаг 2: Как только вы вызовете метод, вы получите SQL-запрос. Собрать его и запустить его в SQL сервер вручную, или вы можете выполнить с помощью ADO.NET


NANDKUMAR GAIKWAD

спасибо за предложение.
и я здесь новичок ... но это не оправдание..
ваш ответ просто потрясающий..
я посылаю вам свой код и говорю, что с ним не так

[no name]

В чем заключается ваша реальная проблема: либо сгенерировать базу данных из схемы Tally, либо привязать данные к выпадающему списку?

NANDKUMAR GAIKWAD

нет никаких проблем с привязкой я пытаюсь получить схему из моего приведенного ниже кода

строке source = "порт=9000;водитель=водитель вяжутся с ODBC;сервер={(по местному)}";
Объекта odbcconnection, кон = нового объекта odbcconnection(источник);
против.Открыть();
DataTable dt = новый DataTable();
string[] restrictions = новая строка[1];
dt = con.GetSchema("Таблицы");
База данных db = новая база данных();

DropDownList1.Источник данных = ДТ;
DropDownList1.DataTextField = "Имя_таблицы";
DropDownList1.DataValueField = "Имя_таблицы";
DropDownList1.DataBind();

я хочу, как создать таблицу в sql server 2008 с этой схемой таблицы и там имя столбца и там тип данных
но когда я использую ваш код я получаю информацию о датируемой схеме

[no name]

Если вы получаете DataTable и его столбцы правильно, то следуйте моему ответу, чтобы сгенерировать SQL-запрос. Как только вы получите SQL-запрос, который вам нужно выполнить в базе данных.

Правильно ли вы получаете схему таблицы из переменной con?

NANDKUMAR GAIKWAD

да, я получаю правильную схему из пробованного кода..
но когда я пытаюсь для одной таблицы или нескольких таблиц он не генерирует скрипт

[no name]

Что это значит: но когда я пытаюсь создать одну таблицу или несколько таблиц, он не генерирует скрипт

NANDKUMAR GAIKWAD

я использую ваш код следующим образом

охраняемых недействительными DropDownList1_SelectedIndexChanged(объект отправителя, EventArgs в электронной)
{
//Label2.Text = "Имя Таблицы :" + Преобразовать.Метод ToString(Список Listbox1.Элемент.Текст);
Label2.Text = "имя таблицы:" + преобразовать.ToString(DropDownList1.SelectedItem.Text);
//DataSet objds = fetchTallyTableContent(Convert.Метод ToString(Список Listbox1.Элемент.Текст));
DataSet objds = fetchTallyTableContent(Convert.ToString(DropDownList1.SelectedItem.Text));
GridView2.Источник данных = objds;
GridView2.DataBind();
// Вызов метода
//DataTable yourDataTableObj = новый DataTable();
//string sqlQuery = CreateTABLE(yourDataTableObj);
DataTable dt = новый DataTable(Convert.ToString(DropDownList1.SelectedItem.Text));
строка sqlQuery = CreateTABLE(dt);
текстовое поле textbox1.Текст = SQL-запрос;
}

публичный набор данных fetchTallyTableContent(строка tblName)
{
//string query = "SELECT * FROM Techweb.TallyUser." + tblName + "" + tblName;
string query = "SELECT * FROM DatavisionITC.TallyUser." + tblName + "" + tblName;
строке source = "порт=9000;водитель=водитель вяжутся с ODBC;сервер={(по местному)}";
Объекта odbcconnection, кон = нового объекта odbcconnection(источник);
OdbcCommand cmd = new OdbcCommand(query, con);
против.Открыть();
OdbcDataAdapter da = новый OdbcDataAdapter(запрос, con);
DataSet ds = новый набор данных();
да.Заполнить(ДС);
против.Закрывать();
возврат ДС;
}
публичная статическая строка CreateTABLE(DataTable table)
{
строка SQL-запрос;
sqlQuery = "создать таблицу" + Таблица.Имятаблицы + "(";
for (int i = 0; i < table.Столбцы.Граф; i++)
{
sqlQuery += "\n [" + таблица.Колонки[i].Имя_столбца + "] ";
строка columnType = таблица.Столбцы[i].тип данных.Метод toString();

// Вы получите разные типы данных в C#(необходимо сменить SQL сервер):boolean значение,байт,символ,даты и времени,десятичных,двухместная,типа INT16,int32 и int64 значение типа,типа sbyte,один, строки,времени,типа uint16,тип uint32,uint64 в
переключатель (columnType)
{
Система дело ".Типа int32":
SQL-запрос += " инт ";
перерыв;
Система дело ".Типа int64":
SQL-запрос += " значение типа bigint ";
перерыв;
Система дело ".Типа INT16":
sqlQuery += " tinyint ";
перерыв;
кейс "система.Десятичный":
sqlQuery += " десятичное число ";
перерыв;
кейс "система.значение datetime":
SQL-запрос += " датавремя ";
перерыв;
кейс "система.Строка":
по умолчанию:
sqlQuery += строка.Формат(" nvarchar({0}) ", таблица.Столбцы[i].MaxLength == -1 ? "max" : таблица.Столбцы[i].максимальная длина.Метод toString());
перерыв;
}

если (табл.Колонки[i].Автоинкремент)
sqlQuery += " IDENTITY(" + таблица.Колонки[i].Автоинкрементное семя.ToString() + "," + таблица.Колонки[i].AutoIncrementStep.Метод toString() + ") ";

если (!таблица.Колонки[i].AllowDBNull)
SQL-запрос += " не нуль ";
SQL-запрос += ",";
}

возвращает SQL-запрос.Подстрока(0, sqlQuery.Длина - 1) + "\n)";
}
}

я получаю имя таблицы, но теперь проблема в том, что выходные данные выглядят следующим образом
где именно я ошибаюсь Я не могу выяснить
"Создать состояние таблицы
)"
это и есть выход

[no name]

Похоже, проблема с таблицей.Столбцы.Подсчитайте, можете ли вы просто отладить и посмотреть, какое значение вы получаете.

NANDKUMAR GAIKWAD

да я отлаживаю и получаю только вывод
"Создать таблицу таблицы
)"
это вых
могу ли я отправить вам полный код с помощью aspx
что вы можете отладить свою сторону
я не могу выяснить точную проблему

NANDKUMAR GAIKWAD

я сделал это я пришлю тебе то что сделал

[no name]

В чем же на самом деле заключалась проблема?

NANDKUMAR GAIKWAD

у меня есть вопрос Манас возможно ли что мы можем вставить данные в базу данных без использования оператора insert
потому что прямо сейчас я создаю базу данных в соответствии с вашим ответом но теперь мне нужно вставить в базу данных без вставки statment

[no name]

да, мы можем сделать это через массовое копирование SQL. Следуйте по ссылке ниже:

http://www.codeproject.com/Articles/18418/Transferring-Data-Using-SqlBulkCopy

http://dotnetmentors.com/c-sharp/bulk-upload-into-sql-server-using-sqlbulkcopy-and-c-sharp.aspx

NANDKUMAR GAIKWAD

спасибо Манас я пытаюсь от тебя ответ

NANDKUMAR GAIKWAD

общее резюме того, что я здесь сделал
1) получить схему базы данных tally
2) Создайте скрипт структуры таблицы в соответствии с вашим кодом
3) для этой структуры таблицы я использовал вашу ссылку массового копирования и сохранения базы данных на sql server(здесь я одновременно использовал создание таблицы и копию culk).

спасибо за вашу помощь это никогда не было возможно что я мог бы сделать это

[no name]

Добро пожаловать приятель :) Надеюсь, вы выполнили великую задачу.

NANDKUMAR GAIKWAD

это все для вас ... сэр Джи

Member 13766988

Я не могу получить схему для базы данных tally

строке source = "порт=9000;водитель=водитель вяжутся с ODBC;сервер={(по местному)}";
Объекта odbcconnection, кон = нового объекта odbcconnection(источник);
против.Открыть();

После исключения этих строк кода.Я получаю исключение, как указано ниже,
Ошибка [IM002] [Microsoft][ODBC Driver Manager] имя источника данных не найдено и драйвер по умолчанию не указан

Может ли кто-нибудь, пожалуйста, помочь мне попробовать это решение