PDA

View Full Version : آموزش ساخت دیتابیس در سیستم مقصد با کلاس DbCreating



esafb52
سه شنبه 28 بهمن 1393, 19:07 عصر
با سلام
امروز قصد دارم یک کلاس نامرتب ولی کاربردی رو براتون بذارم علت نامرتب بودنش اینه که در اون چند تا چیز رو با هم ادغام کردم تا آموزش امروز رو تو یک کلاس بتونم ارائه بدم خدمت دوستان
اما قبل از شروع توضیحی بدم راجب هدفم از این کار
اکثر دوستان مبتدی مثل خودم برای انتقال دیتابیس به سیستم مقصد با مشکل مواجه میشن و نمیتون دیتابیس رو اتچ کنن و یا اون رو بسازن
من دو روش پیشنهاد میدم
الف - استفاده از این کلاس
البته باید یه اسکرپت از دیتابیس خودتون بگیرین و با نام sql.sql کنار برنامه بذارین یا اینکه از پراپرتی مربوطه ستش کنین البته در این روش باید اسم دیتابیس رو ست کنین و برای تهیه اسکریپت در SQL Server Management Studio بر روی دیتابیس کلیک راست و از قسمت task گزینه جنریت دیتابیس اسکرپت رو انتخاب کنین

using System.Collections.Generic;
using System.Data.SqlClient;
using System.IO;
using System.Text.RegularExpressions;
using System.Windows.Forms;

namespace DbCreation
{
public static class DbCreating
{


private static string _scriptpath = Application.StartupPath + "\\" + "sql.sql";
private static string _dbpath = Application.StartupPath;
private static string _dbname = "db";
private static string _servername = @".\SQLExpress";
private static string _constring = string.Format(@"Data Source={0};Integrated Security=True;", _servername);
private static bool _dbcreated = false;



public static bool dbcreated
{
get { return _dbcreated = false; }
set { _dbcreated = value; }
}


public static string servername
{
get { return _servername; }
set { _servername = value; }
}

public static string dbname
{
get { return _dbname; }
set { _dbname = value; }
}

public static string dbpath
{
get { return _dbpath; }
set { _dbpath = value; }
}

public static string constring
{
get { return _constring; }
set { _constring = value; }
}

public static string scriptpath
{
get { return _scriptpath; }
set { _scriptpath = value; }
}

public static bool DbCreationQuery()
{

string[] files =
{
Path.Combine(_dbpath, _dbname + ".mdf"),
Path.Combine(_dbpath, _dbname + ".ldf")
};
string query = "CREATE DATABASE " + _dbname +
" ON PRIMARY" +
" (NAME = " + _dbname + "_data," +
" FILENAME = '" + files[0] + "'," +
" SIZE = 3MB," +
" MAXSIZE = 10MB," +
" FILEGROWTH = 10%)" +

" LOG ON" +
" (NAME = " + _dbname + "_log," +
" FILENAME = '" + files[1] + "'," +
" SIZE = 1MB," +
" MAXSIZE = 5MB," +
" FILEGROWTH = 10%)" +
";";

SqlConnection connection = new SqlConnection(_constring);
SqlCommand command = new SqlCommand(query, connection);
connection.Open();
int res = command.ExecuteNonQuery();
connection.Close();
connection.Dispose();
command.Dispose();
if (res != 0)
return true;
return false;
}

public static void RunScript()
{

if (_dbcreated)
{
string script = File.ReadAllText(_scriptpath);
IEnumerable<string> commandStrings = Regex.Split(script, @"^\s*GO\s*$",
RegexOptions.Multiline | RegexOptions.IgnoreCase);
SqlConnection connection = new SqlConnection(_constring);
connection.Open();
foreach (string commandString in commandStrings)
{
if (commandString.Trim() != "")
{
new SqlCommand(commandString, connection).ExecuteNonQuery();
}
}
connection.Close();
connection.Dispose();

}

}




}
}



و اینم روش استفاده :

// DbCreating.servername = "???????";
// DbCreating.scriptpath = "?????????";
// DbCreating.constring = "????????";
DbCreating.dbname = "fulejask";
if (DbCreating.DbCreationQuery())
{
DbCreating.dbcreated = true;
DbCreating.RunScript();
MessageBox.Show("دیتابیس با موفقیت ایجاد شد");

}


دو- استفاده از ابزاری جالبی به نام SQL Packager
نکته : در حین ایجاد دیتابیس مسیر نباید در درایوی انتخاب بشه که فشردگی فایل ها و پوشه ها رو براش انتخاب کردین اگر مشکلی داشت اطلاع بدین تا پاسخ بدم
موفق باشید

esafb52
چهارشنبه 29 بهمن 1393, 20:16 عصر
با سلام مجدد 45 بازدید و دریغ از یک تشکر!!
جهت رفع خطای ساخت دیتابیس در فولدر ها و درایو های فشرده جهت ذخیره فضای هارد کمی این کلاس رو اصلاح کردم و یک متد رو به اون اضافه کردم تا در هر شرایطی بدون خطا دیتابیس رو بسازه

using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.IO;
using System.Management;
using System.Text.RegularExpressions;
using System.Windows.Forms;

namespace DbCreation
{
public static class DbCreating
{


private static string _scriptpath = Application.StartupPath + "\\" + "sql.sql";
private static string _dbpath = Application.StartupPath;
private static string _dbname = "db";
private static string _servername = @".\SQLExpress";
private static string _constring = string.Format(@"Data Source={0};Integrated Security=True;", _servername);
private static bool _dbcreated = false;



public static bool dbcreated
{
get { return _dbcreated = false; }
set { _dbcreated = value; }
}

public static string servername
{
get { return _servername; }
set { _servername = value; }
}

public static string dbname
{
get { return _dbname; }
set { _dbname = value; }
}

public static string dbpath
{
get { return _dbpath; }
set { _dbpath = value; }
}

public static string constring
{
get { return _constring; }
set { _constring = value; }
}

public static string scriptpath
{
get { return _scriptpath; }
set { _scriptpath = value; }
}

public static bool DbCreationQuery()
{
DirectoryInfo directoryInfo = new DirectoryInfo(_dbpath);
SetFolderCompression(directoryInfo, false);
string[] files =
{
Path.Combine(_dbpath, _dbname + ".mdf"),
Path.Combine(_dbpath, _dbname + ".ldf")
};
string query = "CREATE DATABASE " + _dbname +
" ON PRIMARY" +
" (NAME = " + _dbname + "_data," +
" FILENAME = '" + files[0] + "'," +
" SIZE = 3MB," +
" MAXSIZE = 10MB," +
" FILEGROWTH = 10%)" +

" LOG ON" +
" (NAME = " + _dbname + "_log," +
" FILENAME = '" + files[1] + "'," +
" SIZE = 1MB," +
" MAXSIZE = 5MB," +
" FILEGROWTH = 10%)" +
";";

SqlConnection connection = new SqlConnection(_constring);
SqlCommand command = new SqlCommand(query, connection);
connection.Open();
int res = command.ExecuteNonQuery();
connection.Close();
connection.Dispose();
command.Dispose();
if (res != 0)
return true;
return false;
}

public static void RunScript()
{

if (_dbcreated)
{
string script = File.ReadAllText(_scriptpath);
IEnumerable<string> commandStrings = Regex.Split(script, @"^\s*GO\s*$",
RegexOptions.Multiline | RegexOptions.IgnoreCase);
SqlConnection connection = new SqlConnection(_constring);
connection.Open();
foreach (string commandString in commandStrings)
{
if (commandString.Trim() != "")
{
new SqlCommand(commandString, connection).ExecuteNonQuery();
}
}
connection.Close();
connection.Dispose();

}

}

static void SetFolderCompression(DirectoryInfo path, Boolean on)
{

if (path.Exists)
{

using (ManagementObject dir = new ManagementObject("Win32_Directory.Name=\"" + path.FullName.Replace(@"\", @"\\") + "\""))
{

if (on)
{

dir.InvokeMethod("Compress", null, null);

}

else
{

dir.InvokeMethod("Uncompress", null, null);

}

}

}

}




}
}

mrprestige
چهارشنبه 29 بهمن 1393, 21:58 عصر
سلام دوست من شما ، یعنی شما این پست رو برای تشکر کردن بقیه از خودتون قرار دادید نه برای کمک کردن به مشکل برنامه نویسی بقیه ؟ درسته؟ دوست من همونطور که سهراب سپهری میگه : سعی مثل بارون باشی کاری نداشته باش کاسه های خالی برای کیه؟ .