ویدئو های پربازدید سایت

ذخیره اطلاعات Excell در دیتابیس SQL + فایل پروژه

در این پست قصد داریم تا به کمک به اپلیکیشن ویندوزی با سی شارپ اطلاعات یک فایل اکسل را در دیتابیس قرار دهیم :

برای این نرم افزار نیاز داریم تا یک پروژه ویندزوی سی شارپ به صورت زیر ایجاد کنیم :

انتقال اطلاعات از Excell به SQL,sql,excell,اس کیو ال,اکسل,وارد کردن اکسل در sql,کپی داده ها از اکسل به دیتابیس,دیتابیس

برای باتن ایجاد شده کد های زیر را می نویسیم :

 

private void Button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog ope = new OpenFileDialog
            {
                Filter = "Excel Files|*.xls;*.xlsx;*.xlsm"
            };
            if (ope.ShowDialog()==DialogResult.Cancel)
            {
                return;
            }
            FileStream stream = new FileStream(ope.FileName,FileMode.Open);
            IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);
            DataSet result = excelReader.AsDataSet();
            DataTable firstTable = result.Tables[0];
            firstTable.Rows[0].Delete();
            System.IO.StringWriter writer = new System.IO.StringWriter();
            firstTable.WriteXml(writer, XmlWriteMode.WriteSchema, false);
            string res = writer.ToString();
            DataTable checkData = new DataTable();
            checkData = CheckXml(res);
            if (checkData.Rows.Count>0)
            {
                lblDuplication.Text = "داده تکراری وجود دارد، امکان ذخیره دیتابیس وجود ندارد";
            }
            else
            {
                try
                {
                    using (SqlConnection con = new SqlConnection(@"[Your SQL Connection String]"))
                                    {
                                        using (SqlCommand cmd = new SqlCommand("InsertXML"))
                                        {
                                            cmd.Connection = con;
                                            cmd.CommandType = CommandType.StoredProcedure;
                                            cmd.Parameters.AddWithValue("@xml", res);
                                            con.Open();
                                            cmd.ExecuteNonQuery();
                                            con.Close();
                                        }
                                    }
                                    lblDuplication.Text = "اطلاعات با موفقیت ذخیره شدند";
                }
                catch (Exception)
                {
                    lblDuplication.Text = "یک خطا در نرم افزار روی داده است";
                }
                
            }

        }


 

همچنین در کدهای بالا از تابعی به نام CheckXml استفاده کردیم کردیم که کد اون به این صورت خواهد بود :

 

private DataTable CheckXml(string xml)
        {
            DataSet ds = new DataSet();
            DataTable dt = new DataTable();
            using (SqlConnection con = new SqlConnection(@"Your SQL Connection String"))
            {
                using (SqlCommand cmd = new SqlCommand("CheckXML"))
                {
                    cmd.Connection = con;
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.Parameters.AddWithValue("@xml", xml);
                    con.Open();
                    SqlDataAdapter sda = new SqlDataAdapter
                    {
                        SelectCommand = cmd
                    };
                    sda.Fill(dt);
                    con.Close();
                    return dt;
                }
            }
        }

 

بعد از اجرای کد های بالا نیاز داریم تا پروسیجر افزودن داده های Xml را به دیتابیس ایجاد کنیم

که ابتدا من قصد دارم داده های تکراری رو بررسی کنم 

کد Sql پایین رو اجرا کنید :


USE [HypersourceTestDB]   
go   
SET ansi_nulls ON   
go   
SET quoted_identifier ON   
go   
create PROCEDURE [dbo].[Checkxml] @xml XML   
AS   
  BEGIN   
      SET nocount ON;   
  
      CREATE TABLE #temp11   
        (   
           test_id      NCHAR(10),   
           test_name    VARCHAR(50),   
           test_surname VARCHAR(50),   
           test_age     INT   
        )   
  
      INSERT INTO #temp11   
      SELECT customer.value('(Column1/text())[1]', 'nchar(10)')   AS test_id,   
             customer.value('(Column2/text())[1]', 'varchar(50)') AS test_name,   
             customer.value('(Column3/text())[1]', 'varchar(50)') AS   
             test_surname,   
             customer.value('(Column4/text())[1]', 'int')         AS test_age   
      FROM   @xml.nodes('/NewDataSet/Sheet1')AS TEMPTABLE(customer)   
  
      SELECT *   
      INTO   #temp1   
      FROM   (SELECT *   
              FROM   #temp11   
              UNION ALL   
              SELECT *   
              FROM   test1) AS temp   
  
      SELECT *   
      INTO   #temp2   
      FROM   (SELECT Row_number()   
                       OVER(   
                         partition BY test_id, test_name, test_surname, test_age   
                         ORDER BY test_id) AS rownum,   
                     *   
              FROM   #temp1) AS temp   
  
      SELECT *   
      FROM   #temp2   
      WHERE  rownum > 1   
  END   
--   
-- select * from test1  

 

بعد این کد ها الان باید دستور افزودن دیتا ها داحل دیتابیس رو بنویسیم :



SET ansi_nulls ON   
go   
SET quoted_identifier ON   
go   
ALTER PROCEDURE [dbo].[Insertxml] @xml XML   
AS   
  BEGIN   
      SET nocount ON;   
  
      INSERT INTO test1   
      SELECT customer.value('(Column1/text())[1]', 'nchar(10)')   AS test_id,   
             customer.value('(Column2/text())[1]', 'varchar(50)') AS test_name,   
             customer.value('(Column3/text())[1]', 'varchar(50)') AS   
             test_surname,   
             customer.value('(Column4/text())[1]', 'int')         AS test_age   
      FROM   @xml.nodes('/NewDataSet/Sheet1')AS TEMPTABLE(customer)   
  END   

همچنین کل فایل ها و پروژه ها ضمیمه این آموزش هستند و میتوانید از اینجا پروژه را دانلود کنید

دانلود پروژه

حجم فایل : 3MB

رمز فایل : www.hypersource.ir

 

 

 

در صورتی که سوالی راجع به این آموزش دارید در بخش نظرات همین پست مطرح و از ارسال ان از بخش ارتباط با ما خود داری نمائید


;

ebrahim پاسخ

با عرض سلام و تبریک سال نو ، من روی کامپیوترم sql server 2019 نصب کرده ام چطور با یک برنامه سی شارپ می توانم instance های آن را بدست آورم با تشکر 1400/1/2 12:19

ebrahim پاسخ

با عرض سلام و تبریک سال نو ، من روی کامپیوترم sql server 2019 نصب کرده ام چطور با یک برنامه سی شارپ می توانم instance های آن را بدست آورم با تشکر 😂 1400/1/2 12:20

ghovjnjv

e 1401/5/5 15:29

محمد شفائی پاسخ

سلام و عرض ادب

ممنون و متشکرم دست شما درد نکند
ان شآء الله همواره سالم و تندرست، موفق و مؤید، و عاقبت بخیر باشید 1400/11/9 19:25

ghovjnjv

e 1401/5/5 15:29

ghovjnjv

e 1401/5/5 15:29

احمد پاسخ

فایل پیوست قابل دانلود نیست 1400/11/25 10:29

ghovjnjv

e 1401/5/5 15:29

ghovjnjv

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:30

ghovjnjv

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

ghovjnjv

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

ghovjnjv

-1 OR 2+924-924-1=0+0+0+1 -- 1401/5/5 15:31

ghovjnjv

-1 OR 2+764-764-1=0+0+0+1 1401/5/5 15:31

ghovjnjv

-1' OR 2+44-44-1=0+0+0+1 -- 1401/5/5 15:31

ghovjnjv

-1' OR 2+835-835-1=0+0+0+1 or 'PRshIhm7'=' 1401/5/5 15:31

ghovjnjv

-1" OR 2+346-346-1=0+0+0+1 -- 1401/5/5 15:31

ghovjnjv

if(now()=sysdate(),sleep(15),0) 1401/5/5 15:31

ghovjnjv

0'XOR(if(now()=sysdate(),sleep(15),0))XOR'Z 1401/5/5 15:31

ghovjnjv

0"XOR(if(now()=sysdate(),sleep(15),0))XOR"Z 1401/5/5 15:31

ghovjnjv

(select(0)from(select(sleep(15)))v)/*'+(select(0)from(select(sleep(15)))v)+'"+(select(0)from(select(sleep(15)))v)+"*/ 1401/5/5 15:31

ghovjnjv

1 waitfor delay '0:0:15' -- 1401/5/5 15:31

ghovjnjv

087t8RpY'; waitfor delay '0:0:15' -- 1401/5/5 15:31

ghovjnjv

065JBLqD'); waitfor delay '0:0:15' -- 1401/5/5 15:31

ghovjnjv

ch9CoEGk')); waitfor delay '0:0:15' -- 1401/5/5 15:31

ghovjnjv

czyaDp69' OR 704=(SELECT 704 FROM PG_SLEEP(15))-- 1401/5/5 15:31

ghovjnjv

jkuNBzIV') OR 466=(SELECT 466 FROM PG_SLEEP(15))-- 1401/5/5 15:31

ghovjnjv

25WrPvxY')) OR 594=(SELECT 594 FROM PG_SLEEP(15))-- 1401/5/5 15:31

ghovjnjv

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢'||DBMS_PIPE.RECEIVE_MESSAGE(CHR(98)||CHR(98)||CHR(98),15)||' 1401/5/5 15:31

ghovjnjv

1'" 1401/5/5 15:31

ghovjnjv

1����%2527%2522 1401/5/5 15:31

ghovjnjv

@@JAep4 1401/5/5 15:31

ghovjnjv

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

ghovjnjv

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

ghovjnjv

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

ghovjnjv

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

ghovjnjv

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

ghovjnjv

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

ghovjnjv

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

ghovjnjv

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

ghovjnjv

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

ghovjnjv

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

ghovjnjv

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

ghovjnjv

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

ghovjnjv

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

ghovjnjv

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

ghovjnjv

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

ghovjnjv

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

ghovjnjv

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

ghovjnjv

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

ghovjnjv

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

ghovjnjv

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

ghovjnjv

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

ghovjnjv

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

ghovjnjv

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

-1 OR 2+323-323-1=0+0+0+1 --

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

-1 OR 2+35-35-1=0+0+0+1

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

-1' OR 2+191-191-1=0+0+0+1 --

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

-1' OR 2+739-739-1=0+0+0+1 or 'nEHEnnBr'='

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

-1" OR 2+650-650-1=0+0+0+1 --

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

if(now()=sysdate(),sleep(15),0)

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

0'XOR(if(now()=sysdate(),sleep(15),0))XOR'Z

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

0"XOR(if(now()=sysdate(),sleep(15),0))XOR"Z

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

1 waitfor delay '0:0:15' --

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

XDCpPs3G'; waitfor delay '0:0:15' --

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

YRUFP4z4'); waitfor delay '0:0:15' --

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

bXilGQTq')); waitfor delay '0:0:15' --

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

jGMruC1b' OR 153=(SELECT 153 FROM PG_SLEEP(15))--

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

TS2HdNnE') OR 804=(SELECT 804 FROM PG_SLEEP(15))--

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

elURRrW0')) OR 815=(SELECT 815 FROM PG_SLEEP(15))--

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

ghovjnjv'||DBMS_PIPE.RECEIVE_MESSAGE(CHR(98)||CHR(98)||CHR(98),15)||'

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

1'"

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

1����%2527%2522

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

@@dgPVf

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

ghovjnjv

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

ghovjnjv

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

ghovjnjv

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

ghovjnjv

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

ghovjnjv

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

ghovjnjv

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

ghovjnjv

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

ghovjnjv

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

ghovjnjv

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

ghovjnjv

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

ghovjnjv

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

ghovjnjv

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

ghovjnjv

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

ghovjnjv

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

ghovjnjv

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

ghovjnjv

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

ghovjnjv

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

ghovjnjv

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

ghovjnjv

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

ghovjnjv

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

ghovjnjv

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

ghovjnjv

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

ghovjnjv

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

ghovjnjv

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

ghovjnjv

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

ghovjnjv

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

ghovjnjv پاسخ

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

ghovjnjv پاسخ

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

ghovjnjv پاسخ

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

ghovjnjv پاسخ

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

ghovjnjv پاسخ

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

ghovjnjv پاسخ

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

ghovjnjv پاسخ

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

ghovjnjv پاسخ

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

ghovjnjv پاسخ

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

ghovjnjv پاسخ

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

ghovjnjv پاسخ

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

ghovjnjv پاسخ

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

ghovjnjv پاسخ

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

ghovjnjv پاسخ

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

ghovjnjv پاسخ

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

ghovjnjv پاسخ

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

ghovjnjv پاسخ

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

ghovjnjv پاسخ

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

ghovjnjv پاسخ

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

ghovjnjv پاسخ

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

ghovjnjv پاسخ

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

ghovjnjv پاسخ

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

ghovjnjv پاسخ

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

ghovjnjv پاسخ

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

ghovjnjv پاسخ

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

ghovjnjv پاسخ

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

ghovjnjv پاسخ

e 😥 😨 😭 😱 😳 🙄 🙏 🤑 🤔 🤢 1401/5/5 15:31

سلام دلیل خطا؟ پاسخ

An unhandled exception of type 'System.Data.SqlClient.SqlException' occurred in System.Data.dll
Additional information: Could not find stored procedure 'CheckXML'. 1401/10/15 3:12

افشار پاسخ

موفق باشید،عالیه 1402/7/2 11:52

ویدئو هایی که شاید بپسندید!

هم اکنون نـــظر بدهید

HyperSourCe.ir

info@hypersource.ir

کلیه حقوق برای وب سایت هایپر سورس محفوظ است
CopyRight ©2014-2024
ارتباط با ما
نام شما
ایمیل
موبایل
رمز عبور را فراموش کرده ام

چگونه میتوانم این محصول را با تخفیف دریافت نمایم ؟

لطفا منتظر بمانید. . .

پیام سیستم