PALMisLIFE 討論區

標題: 想請教一下C#的問題 [列印本頁]

作者: kc100639    時間: 2011-5-30 18:49
標題: 想請教一下C#的問題
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO.Ports;
using MySql.Data;
using MySql.Data.MySqlClient;

    namespace mysql
    {
        class Program
        {
            static void Main(string[] args)
            {
                Insert();
            }
            
//
        public int Insert(string Ohm, string Ampere, string volt)
        {
            //設定連線資訊  
            string connStr = String.Format("server=localhost;user id=root; password=123; database=test");

            MySqlConnection conn = new MySqlConnection(connStr);
            //sql字串  
            string sqlStr = "INSERT INTO tbl_SRBack (Ohm,Ampere,volt) VALUES (?Ohm,?Ampere,?volt)";

            try
            {
                conn.Open();
            }
            catch (MySql.Data.MySqlClient.MySqlException ex)
            {
                switch (ex.Number)
                {
                    case 0:
                        Console.WriteLine("Can't Connect to test.");
                        break;
                    case 1045:
                        Console.WriteLine("Account or Password wrong.");
                        break;
                }
                return ex.Number;
            }

            MySqlCommand mySqlCmd = new MySqlCommand(sqlStr, conn);
            //加入參數  
            MySqlParameter[] parameters = new MySqlParameter[3];

            parameters[0] = new MySqlParameter("?Ohm", MySqlDbType.VarChar, 99);
            parameters[0].Value = Ohm;

            parameters[1] = new MySqlParameter("?Ampere", MySqlDbType.VarChar, 99);
            parameters[1].Value = Ampere;

            parameters[2] = new MySqlParameter("?volt", MySqlDbType.VarChar, 99);
            parameters[2].Value = volt;

            mySqlCmd.Parameters.AddRange(parameters);

            try
            {
                mySqlCmd.ExecuteNonQuery();
                return 0;
            }
            catch (MySql.Data.MySqlClient.MySqlException ex)
            {
                return ex.Number;
            }

            }
        }
    }

想問一下~我大致上已經設定差不多了

但是我要怎麼設定我要給的值讓他收取我寫的值讓程式接收然後傳到資料庫

作者: kuanll    時間: 2011-5-30 22:38
看來你真的不懂怎麼寫程式...
假設你之前寫的讀資料能用,那麼只要把insert放到讀資料的迴圈內即可...
下面這個只是示意,
  while (true)
           {               
                try
                {
                    //由rs232讀入一個byte的資料
                    data = rs232.ReadByte();

                    //將讀到的東西顯示出來
                    Console.WriteLine(data.ToString());
                    string [] tmp =data.ToString().Split("-";  //假設你讀出來的資料是用"-"做分隔
                      Insert(tmp[0],tmp[1],tmp[2]); //這邊要帶入你前面所設定的參數
                }
            
            }

不過你這個程式還有很多問題,像是現在這種寫法,資料庫每寫一筆資料就重新連線,實在不是一個好方法
建議先了解一下程式結構再寫...
作者: kc100639    時間: 2011-5-30 22:52
恩...因為我算是研究這個東西的開發者...
但是程式的架構不算很清楚
所以目前先研究個大概出來再改進吧...@@
冒昧問一個問題
我這個回圈要在放那個地方@@"
作者: 小賤健    時間: 2011-5-31 13:03
while (true) {} 迴圈就是你 RS232 傳資料流進來的時候囉~
作者: kc100639    時間: 2011-5-31 13:10
本文章最後由 kc100639 於 2011-5-31 13:15 編輯

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MySql.Data;
using MySql.Data.MySqlClient;
namespace ConsoleApplication10
{
    class Program
    {
      
        static void Main(string[] args)
        {
            string data = string.Empty;

            //開啟rs232 Port (開啟COM1,鮑率為19200,同為檢查為元為沒有,位元率為8,停止位元數為1)
            SerialPort rs232 = new SerialPort("COM1", 19200, Parity.None, 8, StopBits.One);


            //超過5秒鐘(5000毫秒)沒讀到東西,則丟出一個例外(TimeoutException)
            rs232.ReadTimeout = 5000;


            //開啟(建立)連線
            rs232.Open();

            while (true)
           {               
                try
                {
                    //由rs232讀入一個byte的資料
                    data = rs232.ReadByte();

                    //將讀到的東西顯示出來
                    Console.WriteLine(data.ToString());
                    string [] parameters =data.ToString().Split("Ohm-Ampere-volt");  //假設你讀出來的資料是用"-"做分隔
                      Insert(parameters[0],parameters[1],parameters[2]); //這邊要帶入你前面所設定的參數
                }
            
           
            }
            //關閉rs232
            rs232.Close();
      
        }



        //程式片段大概是這樣  
        public int Insert(string Ohm, string Ampere, string volt)
        {
            //設定連線資訊  
            string connStr = String.Format("server=localhost;user id=root; password=123; database=test");

            MySqlConnection conn = new MySqlConnection(connStr);
            //sql字串  
            string sqlStr = "INSERT INTO tbl_test (Ohm,Ampere,volt) VALUES (?Ohm,?Ampere,?volt)";

            try
            {
                conn.Open();
            }
            catch (MySql.Data.MySqlClient.MySqlException ex)
            {
                switch (ex.Number)
                {
                    case 0:
                        Console.WriteLine("Can't Connect to test.");
                        break;
                    case 1045:
                        Console.WriteLine("Account or Password wrong.");
                        break;
                }
                return ex.Number;
            }

            MySqlCommand mySqlCmd = new MySqlCommand(sqlStr, conn);
            //加入參數  
            MySqlParameter[] parameters = new MySqlParameter[3];

            parameters[0] = new MySqlParameter("?Ohm", MySqlDbType.VarChar, 99);
            parameters[0].Value = Ohm;

            parameters[1] = new MySqlParameter("?Ampere", MySqlDbType.VarChar, 99);
            parameters[1].Value = Ampere;

            parameters[2] = new MySqlParameter("?volt", MySqlDbType.VarChar, 99);
            parameters[2].Value = volt;

            mySqlCmd.Parameters.AddRange(parameters);

            try
            {
                mySqlCmd.ExecuteNonQuery();
                return 0;
            }
            catch (MySql.Data.MySqlClient.MySqlException ex)
            {
                return ex.Number;
            }

        }
    }
}

請問是....這樣嗎??
作者: 小賤健    時間: 2011-5-31 13:49
基本上,你的程式應該已經可以動了。只需稍做修改。
1. data = rs232.ReadByte(); 改成 data = rs232.ReadLine(); 較方便。
2. string [] parameters =data.ToString().Split("Ohm-Ampere-volt"; 中,Split 方法是有問題的,換成 string[] parameters = data.Split('-');

這些僅是推測,得視您的 RS232 裝置是如何傳送資料的。總之,試試吧

---
程式能跑不代表沒問題。上述的程式仍有相當的改善空間
作者: kuanll    時間: 2011-5-31 15:49
回覆 kc100639 的文章

我那樣寫的前提是,RS232傳出來的資料格式像是 100-3-20 ,Split會用"-"做分隔,
所以要視你收到的資料格式做調整,的確用Readline()會比較容易一點。

作者: kc100639    時間: 2011-5-31 16:20
本文章最後由 kc100639 於 2011-5-31 16:21 編輯

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MySql.Data;
using MySql.Data.MySqlClient;
namespace ConsoleApplication10
{
    class Program
    {
      
        static void Main(string[] args)
        {
            string data = string.Empty;

            //開啟rs232 Port (開啟COM1,鮑率為19200,同為檢查為元為沒有,位元率為8,停止位元數為1)
            SerialPort rs232 = new SerialPort("COM1", 19200, Parity.None, 8, StopBits.One);

            //開啟(建立)連線
            rs232.Open();

            while (true)
           {               
                try
                {
                    //由rs232讀入一個byte的資料
                    data = rs232.ReadLine();

                    //將讀到的東西顯示出來
                    Console.WriteLine(data.ToString());
                    string[] parameters = data.Split("Ohm-Ampere-volt");  //假設你讀出來的資料是用"-"做分隔
                      Insert(parameters[0],parameters[1],parameters[2]); //這邊要帶入你前面所設定的參數
                }
            
           
            }
            //關閉rs232
            rs232.Close();
      
        }



        //程式片段大概是這樣  
        public int Insert(string Ohm, string Ampere, string volt)
        {
            //設定連線資訊  
            string connStr = String.Format("server=localhost;user id=root; password=123; database=test");

            MySqlConnection conn = new MySqlConnection(connStr);
            //sql字串  
            string sqlStr = "INSERT INTO tbl_test (Ohm,Ampere,volt) VALUES (?Ohm,?Ampere,?volt)";

            try
            {
                conn.Open();
            }
            catch (MySql.Data.MySqlClient.MySqlException ex)
            {
                switch (ex.Number)
                {
                    case 0:
                        Console.WriteLine("Can't Connect to test.");
                        break;
                    case 1045:
                        Console.WriteLine("Account or Password wrong.");
                        break;
                }
                return ex.Number;
            }

            MySqlCommand mySqlCmd = new MySqlCommand(sqlStr, conn);
            //加入參數  
            MySqlParameter[] parameters = new MySqlParameter[3];

            parameters[0] = new MySqlParameter("?Ohm", MySqlDbType.VarChar, 99);
            parameters[0].Value = Ohm;

            parameters[1] = new MySqlParameter("?Ampere", MySqlDbType.VarChar, 99);
            parameters[1].Value = Ampere;

            parameters[2] = new MySqlParameter("?volt", MySqlDbType.VarChar, 99);
            parameters[2].Value = volt;

            mySqlCmd.Parameters.AddRange(parameters);

            try
            {
                mySqlCmd.ExecuteNonQuery();
                return 0;
            }
            catch (MySql.Data.MySqlClient.MySqlException ex)
            {
                return ex.Number;
            }

        }
    }
}

改好的新程式碼



作者: kuanll    時間: 2011-6-1 11:08
看起來你還是不了解這一段
string[] parameters = data.Split("Ohm-Ampere-volt");  //假設你讀出來的資料是用"-"做分隔


應該要寫成 string[] parameters = data.Split("-");
表示,你的資料(也就是data)是一群由"-"分隔的資料,例如 3-20-100 這種格式的
用了這個方法之後資料會變成
parameters[0]=3
parameters[1]=20
parameters[2]=100
再將這三個欄位的值填入資料庫。
作者: 小賤健    時間: 2011-6-1 14:01
本文章最後由 小賤健 於 2011-6-1 22:01 編輯

rs232.Close(); 下面多加 Console.ReadKey();,表示等待使用者按任意鍵回應。
這樣就可以了

--
那就加在  Insert(parameters[0],parameters[1],parameters[2]); 這段的下面了。





歡迎光臨 PALMisLIFE 討論區 (http://www.pil.tw/) Powered by Discuz! X2.5