درهنگام اجرای برنامه در ویژوال استودیو پیغام در تصویر ضمیمه نمایش داده می شود معنی آن چیست و راه حل رفع این مشکل چیه؟
نحوه اتصال دیتابیس مربوطه به این برنامه به چه صورت می باشد
1.jpg
درهنگام اجرای برنامه در ویژوال استودیو پیغام در تصویر ضمیمه نمایش داده می شود معنی آن چیست و راه حل رفع این مشکل چیه؟
نحوه اتصال دیتابیس مربوطه به این برنامه به چه صورت می باشد
1.jpg
سلام
قبل از اجرای Command باید کانکشن رو باز کنی
قوانین سایت برنامه نویس [ به سوالات از طریق پیام خصوصی پاسخ داده نمی شود ]
دوست عزیز آیا کانکشن شما به دیتابیس باز هست؟
اگر دقت کنید در متن خطا هم نوشته که وضعیت اتصال به دیتابیس شما close می باشد.
اصولا موقع ایجاد 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();
.
.
.
}
سلام این کانکشن من هست ببینید درسته اگر اشکال داره بگید
coonect.jpg
برای مقاصد شخصی که خودتون هر زمان بخواهید به کد دسترسی دارید و می توانید 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);
}
میتونی برای دریافت اطلاعات بیشتر برای کار با دیتابیس از کلاس زیر استفاده کنی
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;
}
}
}
آخرین ویرایش به وسیله ژیار رحیمی : سه شنبه 19 فروردین 1399 در 22:38 عصر