PDA

View Full Version : Database & DataGridView



mehran67
دوشنبه 17 فروردین 1388, 16:07 عصر
من تو برنامم میخوام رکوردها رو از database بخونه و فیلد تاریخی رو که تو database دارم رو بررسی کنه ،و فقط اون رکوردهایی رو تو datagridview نشون بده که مثلا قسمت ماه شون برابر 5 باشه .البته یه روش اینه که یه فیلد month توی database اضافه کنم و از اون استفاده کنم اما این روش مد نظر من نیستش .لطفا اگه روش دیگه ای سراغ دارین بگین:اشتباه:

rnm123
دوشنبه 17 فروردین 1388, 18:23 عصر
دوست عزیز راحتترین و البته بهترین راه این است که در هنگام خوانده داده ها ار فایل آنها را فیلتر کنی و فقط داد هایی که شرایط مورد نظر شما را دارند به برنامه بفرستی برای مورد شما میتوانی بصورت زیر به قسمت ماه یا روز یا سال تاریخ ذخیره شده دسترسی داشته باشد


select * from Table1 WHERE Month(DateDay) > '5'

این دستور select شما برای خواندن اطلاعات از بانک میباشد. table1 نام جدول موجود در فایل , DateDay نام فیلد حاوی تاریخ میباشد . عبارت فوق کلیه فیلدهایی که ماه آنها بزرگتر از 5 میباشد را به برنامه بازمیگرداند . حتما نحوه اتصال به پایگاه داده و تعریف یک متغیر جهت اتصال به آن و تنظیمات آنرا بلدی . اطلاعات حاصله را میتونی توی یک دیتاسیت بریزی و بعد با یک حلقه ساده توی دیتاست پیمایش کرده و اطلاعات را یکی یکی وارد دیتا گریدویو کنی

rezatati
دوشنبه 17 فروردین 1388, 18:35 عصر
با سلام
اولا فرمتی که تاریخ رو تو پایگاه داده ذخیره می کنین چی هستش
اگه DateTime باشه شما فیلد تاریخ رو بگیر و به تبدیل DateTime کن و بعد به فیلد Month رو چک کن ببین مساوی با 5 هستش یا نه
و اگه به صورت یک رشته ذخیره کردی اول اونو با استفاده از دستور Split جداش کن و به صورت زیر چک کن

فرض می کنیم که تاریخ توی رشته MyDate باشه


string MyDate = "1388/1/25";
string[] DateSplit = MyDate.Split('/');
if (DateSplit[1] == "5" || DateSplit[1] == "05")
{
//Your Code
}

مثلا در این کد DateSplit[1] برابر با رشته 1 هستش.

rezatati
دوشنبه 17 فروردین 1388, 19:15 عصر
دوست عزیر rnm123 (http://www.barnamenevis.org/forum/member.php?u=47964) اگه تاریخ به صورت شمسی باشه فکر نکنم دستور شما کار کنه

rnm123
دوشنبه 17 فروردین 1388, 23:14 عصر
دوست عزیر rnm123 (http://www.barnamenevis.org/forum/member.php?u=47964) اگه تاریخ به صورت شمسی باشه فکر نکنم دستور شما کار کنه
فکر می کنم تارخ شمسی را مستقیما نمی توان در پایگاه داده ذخیره کرد خطای ( خارج از محدوده ) میدهد. پس الزاما تاریخ میلادی خواهد بود و باید در کد برنامه به شمسی تبدیل شود . البته اگر بصورت رشته ذخیره شود این امر امکان پذیر خواهد بود و البته در آن صورت کد بنده کارنخواهد کرد چون نوع فیلد اصلا از نوع dateTime نیست که sql بتواند قسمت ماه یا سال یا روز آنرا جدا کند

rezatati
دوشنبه 17 فروردین 1388, 23:29 عصر
من هم فکر نکنم که تو یک نرم افزار فارسی تاریخ میلادی به درد بخوره ولی من هر دو روش رو گفتم که البته اگه تاریخ به صورت dateTime در پایگاه داده ذخیره بشه روش دوستمون rnm123 (http://barnamenevis.org/forum/member.php?u=47964) خیلی بهتره چون در این مورد رکوردهایی که به درد نخور هستند از پایگاه استخراج نمی شن ولی اگه رشته باشه باید از روشی که در بالا گفته شده استفاده کنین البته شاید دوستان روش بهتر ی بلدند ولی ما این به ذهنمون رسید

mom alone
دوشنبه 17 فروردین 1388, 23:39 عصر
من تاریخ رو به صورت رشته و حتما با 10 کاراکتر وارد می کنم مثلا 1387/01/01
حالا برای سلکت شما


where table.tarikh like %/05/%



من یه لحظه قاطی کردم نمی دونم علامت درصد باید باشه یا ستاره
خودت امتحان کن
من هیچ مشکلی با تاریخ ندارم(به صورت رشته)
شما هم همین کارو بکن تو شرط >= و <= هم جواب میده
مانند تاریخ واقعی

asd_moghadas
سه شنبه 18 فروردین 1388, 08:11 صبح
سلام چطوری میتوان تاریخ میلادی رادر دیتاگریدویو به شمسی تیدیل کرد بعد از دستور selectبه جدول مورد نظر لطفا راهنمایی کنید

asd_moghadas
سه شنبه 18 فروردین 1388, 08:26 صبح
سلام چطوری میتوان تاریخ میلادی رادر دیتاگریدویو به شمسی تیدیل کرد بعد از دستور selectبه جدول مورد نظر لطفا راهنمایی کنید درمورد فایل ضمیمه اگه کسی میتونه کمک کنه

Happy_davood
سه شنبه 18 فروردین 1388, 09:20 صبح
ذخیره تاریخ بصورت میلادی خیلی کارآمد تر از روش رشته ای هست .
ضمناً برای تبدیل هم نباید سمت برنامه کاری انجام بدید . باید یه Function سمت DB داشته باشید که میلادی رو گرفته و شمسی می ده . بعدش اینطوری یه Select بزنید و Grid رو پر کنید :




SELECT dbo.ToSolarDate(ChristionDateTime) FROM AnyTable



این Function هم باید همچین چیزی باشه :




CREATE FUNCTION GetSolarDate (@DateTime DATETIME)
RETURNS CHAR(10) AS
BEGIN
.
.
.
RETURN @DateString
END


ذخیره کردن میلادی هم کارامد تر هست چون میتونید از توابع و امکانان استاندار هم سمت DB و هم سمت برنامه استفاده کنید

asd_moghadas
سه شنبه 18 فروردین 1388, 10:10 صبح
تشکر از Happy_davood اگه ممکنه بیشتر راهنمایی کنید یکی از دوستان این روش راپیشنهادداد اما نتوانستم استفاده کنم
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace MyTest
{
public partial class Form1 : Form
{
private SqlConnection SqlCon;
private SqlCommand SqlCmd;
private SqlDataAdapter SqlDA;
private DataTable DTable;
private long Id;
private long Cal;
public Form1()
{
InitializeComponent();
}
private void Binding()
{
//try
//{
//DateTime dt = Convert.ToDateTime(FarsiLibrary.Utils.PersianDateC onverter.ToPersianDate(DateEtebar22.SelectedDateTi me));
SqlCon = new SqlConnection();
SqlCon.ConnectionString = MyTest.Properties.Settings.Default.MyTestConnectio nString;
SqlCon.Open();
SqlCmd = new SqlCommand();
SqlCmd.Connection = SqlCon;
SqlCmd.CommandType = CommandType.Text;
SqlCmd.CommandText = "SELECT *FROM MyDate"; //WHERE (ID=@Id)";
//SqlCmd.Parameters.Add("@Id", SqlDbType.BigInt).Value = Id;

SqlDA = new SqlDataAdapter();
SqlDA.SelectCommand = SqlCmd;
SqlCmd.ExecuteNonQuery();
DTable = new DataTable();
SqlDA.Fill(DTable);
dataGridView1.DataSource = DTable;
// SqlCon.Close();
//dataGridView1.Rows.Clear();
//if (DTable.Rows.Count > 0)
//{
// FarsiLibrary.Utils.PersianDate p1, p2;
// DataRow[] Drows = new DataRow[DTable.Rows.Count];
// DTable.Rows.CopyTo(Drows, 0);
// for (int i = 0; i < Drows.Length - 1; i++)
// {
// for (int j = i + 1; j < Drows.Length; j++)
// {
// p1 = FarsiLibrary.Utils.PersianDateConverter.ToPersianD ate((DateTime)Drows[i].ItemArray[6]);
// p2 = FarsiLibrary.Utils.PersianDateConverter.ToPersianD ate((DateTime)Drows[j].ItemArray[6]);
// if (p1 > p2)
// {
// DataRow dr;
// dr = Drows[i];
// Drows[i] = Drows[j];
// Drows[j] = dr;
// }
// }
// }
// for (int j = 0; j < Drows.Length; j++)
// {
// DateTime Persian = FarsiLibrary.Utils.PersianDateConverter.ToPersianD ate((DateTime)Drows[j].ItemArray[6]);
// if (Persian >= DateEtebar22.SelectedDateTime)
// {
// if ((byte)Drows[j].ItemArray[4] == 1)
// {
// Cal += (long)Drows[j].ItemArray[8];
// dataGridView1.Rows.Add(++counter, Persian, Drows[j].ItemArray[1], Drows[j].ItemArray[1]
// , 0, Drows[j].ItemArray[8], Cal);
// }
/*if (((byte)Drows[j].ItemArray[4] == 3) || ((byte)Drows[j].ItemArray[4] == 4))
{
Cal -= (long)Drows[j].ItemArray[8];
dataGridView1.Rows.Add(++counter, Persian, Drows[j].ItemArray[2], Drows[j].ItemArray[5]
, Drows[j].ItemArray[8], 0, Cal);
}*/
//}
SqlCon.Close();

//catch (Exception ex)
//{
// MessageBox.Show(ex.Message);
//}
//finally
//{
// SqlCon.Close();
//}

}
private void Form1_Load(object sender, EventArgs e)
{
Binding();
}
}
}

NewFoxStudent
سه شنبه 18 فروردین 1388, 10:18 صبح
این کدها هم توابع تبدیل تاریخ رو در Sql میسازه
البته از همین سایت گرفتمشون ولی یادم نیست از کجاش بنابر این ذکر منبع میسر نیست




CREATE FUNCTION GetFarsiDate(@DateLatin AS DateTime)
RETURNS CHAR(10) AS
BEGIN
DECLARE @DateFarsi CHAR(10)
DECLARE @Days int
DECLARE @Tmp int
DECLARE @Year_Farsi int
DECLARE @Month_Farsi int
DECLARE @Day_Farsi int
SET @Days = DATEDIFF(DAY, '19000320', @DateLatin)
SET @Year_Farsi = 1279
SET @Month_Farsi = 01
SET @Day_Farsi = 01
SET @Tmp = @Days / 365
IF (@Tmp * 365) + ((@Tmp + 3) / 4) > @Days
SET @Tmp = @Tmp - 1
SET @Year_Farsi = @Year_Farsi + @Tmp
SET @Days = @Days - (@Tmp * 365) - ((@Tmp + 3) / 4)

IF @Days <= 186
BEGIN
SET @Tmp = @Days / 31
SET @Month_Farsi = @Month_Farsi + @Tmp
SET @Days = @Days - (@Tmp * 31)
END
ELSE
BEGIN
SET @Days = @Days - 186
SET @Tmp = @Days / 30
SET @Month_Farsi = @Month_Farsi + @Tmp + 6
SET @Days = @Days - (@Tmp * 30)
END
SET @Day_Farsi = @Day_Farsi + @Days
RETURN REPLACE(STR(@Year_Farsi, 4, 0) +
STR(@Month_Farsi, 2, 0) +
STR(@Day_Farsi,2, 0), ' ', '0')
END




CREATE FUNCTION GetLatinDate(@DateFarsi CHAR(10))
RETURNS DateTime AS
BEGIN
SET @DateFarsi = REPLACE(@DateFarsi, '/', '')

DECLARE @Days BigInt

DECLARE @Year_Farsi int
DECLARE @Month_Farsi int
DECLARE @Day_Farsi int

SET @Year_Farsi = CONVERT(int, SUBSTRING(@DateFarsi, 1, 4))
SET @Month_Farsi = CONVERT(int, SUBSTRING(@DateFarsi, 5, 2))
SET @Day_Farsi = CONVERT(int, SUBSTRING(@DateFarsi, 7, 2))

SET @Days = ((@Year_Farsi - 1279) * 365) + ((@Year_Farsi - 1276) / 4)

IF @Month_Farsi <= 7
SET @Days = @Days + ((@Month_Farsi - 1) * 31)
ELSE
SET @Days = @Days + ((@Month_Farsi - 7) * 30) + 186

RETURN DATEADD(DAY, @Days + @Day_Farsi - 1, '19000320')
End

Happy_davood
سه شنبه 18 فروردین 1388, 10:35 صبح
خوب روشی رو که آقای asd_moghadas نوشتن خیلی پیچیده تر هست . همیشه در همه فرم ها باید کلی کد نوشت تا که مشکل تاریخ حل بشه در حالیکه روش تبدیل سمت DB بسیار راحتره (سرعت اجرا ، پیچیدگی کد ...)
اگر آقای NewFoxStudent از صحت توابعی که گذاشتن اطمینان ندارند بگید تا من مال خودم رو بفرستم .
البته در سمت DB نیازی به تبدیل شمسی به میلادی نیست . چون تمام تاریخ ها از سمت برنامه به میلادی تبدیل شده و به DB پاس می شوند و فقط تبدیل میلادی به شمسی کافیه .

NewFoxStudent
سه شنبه 18 فروردین 1388, 10:37 صبح
توابعی که من گذاشتم کاملاً درست کار میکنه و خیلی وقته دترم ازشون استفاده میکنم
تا حالا مشکلی نداشتن

asd_moghadas
سه شنبه 18 فروردین 1388, 11:23 صبح
اگه ممکنه happy_davoodان راهم بگذارید

Happy_davood
سه شنبه 18 فروردین 1388, 12:36 عصر
CREATE FUNCTION GetSolarDate (@DateTime DATETIME)
RETURNS CHAR(10) AS
BEGIN
IF (@DateTime = '')
RETURN ''

DECLARE @yy AS INT -- year
DECLARE @mm AS INT -- month
DECLARE @dd AS INT -- day

DECLARE @DateString AS NVARCHAR(10) -- yy/mm/dd

DECLARE @M1 AS INT -- days of month 1
DECLARE @M2 AS INT -- days of month 2
DECLARE @M3 AS INT -- days of month 3
DECLARE @M4 AS INT -- days of month 4
DECLARE @M5 AS INT -- days of month 5
DECLARE @M6 AS INT -- days of month 6
DECLARE @M7 AS INT -- days of month 7
DECLARE @M8 AS INT -- days of month 8
DECLARE @M9 AS INT -- days of month 9
DECLARE @M10 AS INT -- days of month 10
DECLARE @M11 AS INT -- days of month 11

DECLARE @Total AS INT -- total days of miladi date
DECLARE @TotalSolar AS INT -- total days of solar date

SET @M1 = 31
SET @M2 = 28
SET @M3 = 31
SET @M4 = 30
SET @M5 = 31
SET @M6 = 30
SET @M7 = 31
SET @M8 = 31
SET @M9 = 30
SET @M10 = 31
SET @M11 = 30

-- get yy , mm , dd from DateTime
-- *****************************************
SET @yy = DATEPART(YEAR, @DateTime)
SET @mm = DATEPART(MONTH, @DateTime)
SET @dd = DATEPART(DAY, @DateTime)

IF @yy % 4 = 0 -- leap year
SET @M2 = 29

-- calculating total days of miladi year
-- *****************************************
IF @mm = 1
SET @Total = @dd
IF @mm = 2
SET @Total = @dd + @M1
IF @mm = 3
SET @Total = @dd + @M1 + @M2
IF @mm = 4
SET @Total = @dd + @M1 + @M2 + @M3
IF @mm = 5
SET @Total = @dd + @M1 + @M2 + @M3 + @M4
IF @mm = 6
SET @Total = @dd + @M1 + @M2 + @M3 + @M4 + @M5
IF @mm = 7
SET @Total = @dd + @M1 + @M2 + @M3 + @M4 + @M5 + @M6
IF @mm = 8
SET @Total = @dd + @M1 + @M2 + @M3 + @M4 + @M5 + @M6 + @M7
IF @mm = 9
SET @Total = @dd + @M1 + @M2 + @M3 + @M4 + @M5 + @M6 + @M7 + @M8
IF @mm = 10
SET @Total = @dd + @M1 + @M2 + @M3 + @M4 + @M5 + @M6 + @M7 + @M8 + @M9
IF @mm = 11
SET @Total = @dd + @M1 + @M2 + @M3 + @M4 + @M5 + @M6 + @M7 + @M8 + @M9 + @M10
IF @mm = 12
SET @Total = @dd + @M1 + @M2 + @M3 + @M4 + @M5 + @M6 + @M7 + @M8 + @M9 + @M10 + @M11

-- calculating yy of solar year
-- *****************************************
IF @Total <= 79
SET @yy = @yy - 622
ELSE
SET @yy = @yy - 621

-- calculating total days of solar year
-- *****************************************
IF @Total > 79 -- ater new solar year
SET @TotalSolar = @Total - 79
ELSE -- before new solar year
BEGIN
IF ((@yy + 1) % 4 = 0) -- leap year
SET @TotalSolar = @Total + 287
ELSE -- normal year
SET @TotalSolar = @Total + 286
END

-- calculating mm, dd of solar year
-- *****************************************
IF @TotalSolar <= 186 -- 1st half of solar year
BEGIN
SET @mm = 1
WHILE @TotalSolar > 31
BEGIN
SET @TotalSolar = @TotalSolar - 31
SET @mm = @mm + 1
END
END
ELSE -- 2nd half of solar year
BEGIN
SET @TotalSolar = @TotalSolar - 186
SET @mm = 7
WHILE @TotalSolar > 30
BEGIN
SET @TotalSolar = @TotalSolar - 30
SET @mm = @mm + 1
END
END

SET @dd = @TotalSolar

-- SET @yy = @yy % 100 -- 2 least digits (0~99)

SET @DateString = LTRIM(RTRIM(STR(@yy/ 1000))) -- y : 1000
SET @DateString = @DateString + LTRIM(RTRIM(STR(@yy % 1000) / 100)) -- yy : 100
SET @DateString = @DateString + LTRIM(RTRIM(STR(@yy % 100)/ 10)) -- yyy : 10
SET @DateString = @DateString + LTRIM(RTRIM(STR(@yy % 10))) -- yyyy : 1
SET @DateString = @DateString + '/' -- yyyy/
SET @DateString = @DateString + LTRIM(RTRIM(STR(@mm / 10))) -- yyyy/m
SET @DateString = @DateString + LTRIM(RTRIM(STR(@mm % 10))) -- yyyy/mm
SET @DateString = @DateString + '/' -- yyyy/mm/
SET @DateString = @DateString + LTRIM(RTRIM(STR(@dd / 10))) -- yyyy/mm/d
SET @DateString = @DateString + LTRIM(RTRIM(STR(@dd % 10))) -- yyyy/mm/dd

RETURN @DateString
END

Happy_davood
سه شنبه 18 فروردین 1388, 12:38 عصر
به نظر میرسه مال آقای NewFoxStudent بهینه و خلاصه هست .
از همون استفاده کنید . البته من چند سالی هست که از همین استفاده می کنم و ایرادی هم نداره و خودم هم نوشتمش .
منتهی اون زمان ناشی تر بودم و زیاد شاید خوب و بهینه نباشه .

asd_moghadas
پنج شنبه 20 فروردین 1388, 07:30 صبح
راهنمایی در مورد استفاده از توابع فوق چگونه وچطور فوری ممنون

Happy_davood
پنج شنبه 20 فروردین 1388, 08:13 صبح
قبلاً گفتم دیگه به جای اینکه برای پر کردن دیتاگردی این Select رو بزندی :




SELECT Date, Name, Family, .... FROM AnyTable



به جاش این رو بزنید :




SELECT dbo.GetSolarDate(Date) AS Date, Name, Family, .... FROM AnyTable


GetSolarDate هم همون تابعی هست که من و یکی از دوستان قبلاً گذاشتیم براتون (که باید در قسمت User Defined Functions قرار گرفته بشه)

Samavati2010
پنج شنبه 29 مهر 1389, 10:05 صبح
:تشویق:ممنون از راهنماییتون

FCOFCO
شنبه 15 آبان 1389, 18:31 عصر
سلام به دوستان.من یه برنامه ساده نوشتم که توی اون از SQL موجود در C#‎‎‎ استفاده کردم. موقعی که برنامه RUNهست به راحتی می تونم اطلاعات رو توی DataGridView بریزم و یا بخونم. ولی وقتیکه برنامه رو می بندم و مجدداً باز می کنم هیچکدوم از اطلاعاتی رو که saveکرده بودم رو نشون نمیده. میشه لطفاً منو راهنمایی کنید؟

privatevoid btnSave_Click(object sender, EventArgs e)
{
SqlConnection conn = newSqlConnection();
conn.ConnectionString = @"Data Source=.\SQLEXPRESS;
AttachDbFilename=|DataDirectory|\Vehicle.mdf;
Integrated Security=True;
User Instance=True";
conn.Open();
SqlCommand cmd = newSqlCommand();
cmd.Connection = conn;
string sql = "insert into TAG (No,Name,Tag,Location,State)";
sql += "values({0},'{1}','{2}','{3}','{4}')";
sql = string.Format(sql,txtNo.Text, txtName.Text, txtID.Text, txtLocation.Text, txtState.Text);
cmd.CommandText = sql;
cmd.ExecuteNonQuery();
this.Close();
}