PDA

View Full Version : مبتدی: مشکل در اجرای برنامه در ویژوال استودیو



hooman6180
یک شنبه 10 فروردین 1399, 02:02 صبح
درهنگام اجرای برنامه در ویژوال استودیو پیغام در تصویر ضمیمه نمایش داده می شود معنی آن چیست و راه حل رفع این مشکل چیه؟


نحوه اتصال دیتابیس مربوطه به این برنامه به چه صورت می باشد


151515

محمد آشتیانی
یک شنبه 10 فروردین 1399, 02:12 صبح
سلام
قبل از اجرای Command باید کانکشن رو باز کنی

mp_mp353
یک شنبه 10 فروردین 1399, 20:12 عصر
دوست عزیز آیا کانکشن شما به دیتابیس باز هست؟
اگر دقت کنید در متن خطا هم نوشته که وضعیت اتصال به دیتابیس شما close می باشد.

hooman6180
سه شنبه 12 فروردین 1399, 23:43 عصر
دوست عزیز آیا کانکشن شما به دیتابیس باز هست؟
اگر دقت کنید در متن خطا هم نوشته که وضعیت اتصال به دیتابیس شما close می باشد.

میشه روش رو توضیح دهید که به چه صورت کانکشن به دیتابیس باز می شود

the king
چهارشنبه 13 فروردین 1399, 00:34 صبح
میشه روش رو توضیح دهید که به چه صورت کانکشن به دیتابیس باز می شود

اصولا موقع ایجاد SqlCommand برایش یک Connection مشخص می کنید. حالا یا به عنوان پارامتر دومی بعد از اون "...select * from" یا بعدا از طریق مشخصه Connection اش.
مثلا :

SqlCommand cmd = new SqlCommand("select * from Test", connection);

یا :

SqlCommand cmd = new SqlCommand("select * from Test");
cmd.Connection = connection;

اون connection باید Open شده باشه، بجز خود connection از طریق cmd.Connection هم بهش دسترسی دارید.
با ()connection.Open یا ()cmd.Connection.Open بازش می کنید.
تلاش برای باز کردن یک connection ای که قبلا Open شده منجر به خطا میشه، برای همین می توانید قبلش چک کنید که آیا از قبل Open هست یا نه.

if (connection.State == ConnectionState.Closed)
{
connection.Open();
}


نمیخوام بگم لازمه که حتما روال کد نویسی تون رو تغییر بدید اما اگه لزومی نداره که connection همیشه باز بمونه و میخواهید در موقع لزوم باز و بعد استفاده بسته بشه،
بهتره که از using استفاده کنید که یک روش اصولی است، using تضمین می کنه که ()Close انجام بشه :

using (SqlConnection connection = new SqlConnection("your connection string"))
{
connection.Open();
.
.
.
}

hooman6180
یک شنبه 17 فروردین 1399, 01:16 صبح
سلام این کانکشن من هست ببینید درسته اگر اشکال داره بگید
151540

the king
یک شنبه 17 فروردین 1399, 03:35 صبح
سلام این کانکشن من هست ببینید درسته اگر اشکال داره بگید
151540
برای مقاصد شخصی که خودتون هر زمان بخواهید به کد دسترسی دارید و می توانید strConnectionstring رو تغییر بدهید مشکلی نیست، اما اگر قراره برنامه ای بنویسید که روی سیستم های دیگری یا در مسیری بجز اون ...D:\document بتونه مستقر و اجرا بشه، اون رشته ثابت داخل کد دردسر میشه چون باید قابل تغییر باشه، کاربر هم به کد احتیاج داره و هم کامپایلر ویژوال استدیو.
بهتره که به کاربر این امکان رو بدید که رشته connection string متفاوتی رو برای برنامه ثبت کنه و از یک رشته ثابت داخل کد استفاده نکنید.
مثلا از داخل یک فایل txt کنار فایل اجرایی برنامه بخونیدش، یا از یک مقدار داخل Application Settings یا از Application Configuration File یا ...


var path = "database.txt";
try
{
var strConnectionstring = System.IO.File.ReadAllLines(path)[0];
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}


که البته بهتره مسیر فایل برای جستجو دقیقا محل فایل اجرایی برنامه باشه، نه مسیر پوشه فعلی :

var folder = System.IO.Path. GetDirectoryName(Application.ExecutablePath);
var path = System.IO.Path. Combine(folder, "database.txt");
try
{
var strConnectionstring = System.IO.File.ReadAllLines(path)[0];
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}


می توانید در منوی ...Project > {projectname} Properties ویژوال استدیو در زبانه Settings یک مقدار مثلا با نام MyConnectionString و از نوع string اضافه کنید تا داخل کد برنامه از اونجا مقدار بخونید :

try
{
var strConnectionstring = Properties.Settings.Default.MyConnectionString;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}


یا از کاربر مقدارش رو دریافت کنید و ذخیره کنید :

try
{
Properties.Settings.Default.MyConnectionString = textBox1.Text;
Properties.Settings.Default.Save();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}

mp_mp353
یک شنبه 17 فروردین 1399, 13:26 عصر
میتونی برای دریافت اطلاعات بیشتر برای کار با دیتابیس از کلاس زیر استفاده کنی



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;


namespace App
{
class DBclass
{


public static SqlConnection con = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirector y|\DB.mdf;Integrated Security=True;User Instance=True;");
public static string connection_string = @"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirector y|\DB.mdf;Integrated Security=True;User Instance=True;";


public static DataSet _Select(string command, string tablename)
{
if (con.State != ConnectionState.Open)
{
con.Open();
}
//command = command.Replace('ي', 'ی');
SqlDataAdapter da = new SqlDataAdapter(command, con);
DataSet ds = new DataSet();
da.Fill(ds, tablename);
con.Close();
return ds;
}


public static void _Insert(string commandText)
{
if (con.State != ConnectionState.Open)
{
con.Open();
}
//command = command.Replace('ي', 'ی');
SqlCommand com = new SqlCommand(commandText, con);
com.ExecuteNonQuery();
con.Close();
}


public static void _Insert(SqlCommand command)
{
if (con.State != ConnectionState.Open)
{
con.Open();
}
command.Connection = con;
command.ExecuteNonQuery();
con.Close();
}


public static int get_id(String tablename)
{
if (con.State != ConnectionState.Open)
{
con.Open();
}
int id = 1;
SqlDataAdapter da = new SqlDataAdapter("SELECT id FROM " + tablename + " ORDER BY id", con);
DataSet ds = new DataSet();
da.Fill(ds, tablename);
con.Close();
if (ds.Tables[0].Rows.Count > 0)
{
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
if (Convert.ToInt32(ds.Tables[0].Rows[i][0].ToString()) != id)
{
return id;
}
id++;
}
}
return id;
}
}
}