c#開發(fā)會員管理系統(tǒng)遇到的問題

main.png

開發(fā)這個(gè)系統(tǒng)谷异,是因?yàn)榕笥严胍雒撁珪T來訪記錄了。。怨咪。

問題1:如何連接數(shù)據(jù)庫

csharp中使用數(shù)據(jù)庫需要引入:System.Data.SqlClient
首先新建一個(gè)類文件SqlServerInfo乏矾,在其中定義數(shù)據(jù)庫的基本信息和數(shù)據(jù)庫連接字符串
文件名:SqlServerInfo.cs

內(nèi)容如下:

 struct LoginFormSQLInfo
    {
        public static string SQLServerAddr="127.0.0.1";//本地?cái)?shù)據(jù)庫
        public static string SQLUserName="sa";//使用sa驗(yàn)證
        public static string SQLUserPass="123456";//數(shù)據(jù)庫密碼
        public static string SQLDataBase= "AmiroBase";//連接的數(shù)據(jù)庫名稱
    }
    
    class SqlServerInfo
    {
        public static string LoginSQLConnectStr = $"server={LoginFormSQLInfo.SQLServerAddr};uid={LoginFormSQLInfo.SQLUserName};pwd={LoginFormSQLInfo.SQLUserPass};database={LoginFormSQLInfo.SQLDataBase};Connection Timeout=5;MultipleActiveResultSets=true";

    }//數(shù)據(jù)庫連接字

之后定義一個(gè)類OpenSQLSERVER孟抗,用來進(jìn)行數(shù)據(jù)庫連接等操作,內(nèi)容如下:

SqlConnection LoginConnectResult = new SqlConnection(SqlServerInfo.LoginSQLConnectStr);//傳入SqlServerInfo類中的數(shù)據(jù)庫連接字
        public SqlConnection Start()
        {
            LoginConnectResult.Open();
            return LoginConnectResult;//打開數(shù)據(jù)庫钻心,返回結(jié)果
        }
        public void Close()
        {
            LoginConnectResult.Close();//關(guān)閉連接
        }

這里都定義好了凄硼,理論來講就可以執(zhí)行數(shù)據(jù)庫的登錄操作了,然而為了避免用戶沒有安裝數(shù)據(jù)庫的問題捷沸,在窗口加載出來之前應(yīng)該查詢是否安裝SQL serve數(shù)據(jù)庫摊沉,在program.cs文件中添加如下內(nèi)容:

                bool State;
                CheckSQLServer CSL = new CheckSQLServer();
                State = CSL.SQLServerInstallState();
                if (!State)
                {
                    MessageBox.Show("系統(tǒng)檢測到您沒有安裝SQLSERVER或SQLSERVER版本低于2008,請重新安裝SQLSERVER痒给。", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);//彈出提示
                }

CheckSQLServer是檢查數(shù)據(jù)庫是否安裝的一個(gè)類说墨,其內(nèi)容如下:

         bool State;
        string SoftWareRegistrPath;
        RegistryKey LocalMachinePath;
        public CheckSQLServer()
        {
            SoftWareRegistrPath = @"Software\Microsoft\MSSQLServer\MSSQLServer";//SQLSERVER安裝的注冊表目錄
            LocalMachinePath = Registry.LocalMachine.OpenSubKey(SoftWareRegistrPath, false);//查詢注冊表項(xiàng)
            if (LocalMachinePath != null)
            {
                State = true;
            }
            else
            {
                State = false;
            }
        }
        public bool SQLServerInstallState()
        {
            return State;
        }

因?yàn)椴还苁沁B接數(shù)據(jù)庫失敗,還是端口或者數(shù)據(jù)庫不存在苍柏,他們拋出的異常都是一樣的尼斧,只有Message信息不同,所以我們?nèi)坎东@序仙,然后寫入到log中突颊,首先定義一個(gè)WriteLog類,其內(nèi)容如下:

 public void WriteToLogFile(string ErrorText)
        {
            string LogFileName = Application.StartupPath+@"\log.txt";//程序目錄下面添加一個(gè)log文件
            string CheckTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");//獲取發(fā)生log的時(shí)間
            StreamWriter FileWrite = new StreamWriter(LogFileName,true);//實(shí)例化streamwriter對象
            FileWrite.WriteLine(CheckTime+"\t"+ErrorText);//寫入log日志
            FileWrite.Flush();//清除緩沖區(qū)
            FileWrite.Close();//關(guān)閉對象
        }

考慮到在開發(fā)過程中需要多次使用到messagebox函數(shù)潘悼,所以新建一個(gè)類ShowMessageBox律秃,在其內(nèi)部重載原類函數(shù),內(nèi)容如下:

public void ShowError(string Content, string Caption)
        {
            MessageBox.Show(Content,Caption,MessageBoxButtons.OK,MessageBoxIcon.Error);
        }
        public void ShowInforMation(string Content, string Caption)
        {
            MessageBox.Show(Content, Caption, MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
        public void ShowWarining(string Content, string Caption)
        {
            MessageBox.Show(Content, Caption, MessageBoxButtons.OK, MessageBoxIcon.Warning);
        }

然后進(jìn)行登錄界面的異常捕獲操作:

 ShowMessageBox SMB = new ShowMessageBox();
            try
            {
                if (Login_Form_UserName.Text.Trim() == "" && Login_Form_UserPassword.Text.Trim() == "")
                {
                    SMB.ShowError("請輸入賬號密碼", "錯(cuò)誤");
                }
               else
                {
                          //...
                }
catch (Exception ErrorMessage)
            {
                WriteLog WLG = new WriteLog();
                WLG.WriteToLogFile(ErrorMessage.Message);//寫入日志
                SMB.ShowError("數(shù)據(jù)庫連接失敗治唤,可能是以下原因:\n1.數(shù)據(jù)庫的賬號密碼沒有設(shè)為sa/123456\n2.數(shù)據(jù)庫端口沒有啟動(dòng)\n3.數(shù)據(jù)庫服務(wù)沒有啟動(dòng)\n4.其他異常問題\n請檢查之后重試棒动。", "錯(cuò)誤");
            }

為了保證程序的穩(wěn)定性,新定義一個(gè)類CheckSQLProcess用于檢測數(shù)據(jù)庫進(jìn)程是否存在宾添,防止數(shù)據(jù)庫服務(wù)沒有啟動(dòng)導(dǎo)致日志過多無效錯(cuò)誤:

public bool SQLRunState()
        {
            Process[] ProcessArray;
            ProcessArray = Process.GetProcessesByName("sqlservr");//查找sqlservr進(jìn)程
            if (ProcessArray.Length != 0)
            {
                return true;//存在進(jìn)程
            }
            else
            {
                return false;//不存在
            }
        }

因?yàn)槊看纬霈F(xiàn)錯(cuò)誤都會對log文件進(jìn)行寫入數(shù)據(jù)船惨,且不做覆蓋柜裸,方便查找錯(cuò)誤存在,所以必然需要對日志文件大小進(jìn)行控制粱锐,所以新建一個(gè)類CheckLogFileSize疙挺,內(nèi)容如下:

string LogFileName = Application.StartupPath + @"\log.txt";
        public CheckLogFileSize()
        {
            bool FileState;
            FileState = File.Exists(LogFileName);
            if (FileState)
            {
                double FileLengh;
                FileInfo FileSize = new FileInfo(LogFileName);//獲取log文件信息
                FileLengh = Math.Ceiling(FileSize.Length / 1024.0);//獲取文件大小
                if (FileLengh >= 800)
                {
                    File.Delete(LogFileName);//刪除log日志
                }
            }
            else
            {
                //
            }

//上面提到的檢測數(shù)據(jù)庫進(jìn)程和檢測文件大小都是在登錄窗口載入完成之后進(jìn)行操作的。
前期保障工作已經(jīng)做完了怜浅,接下來就可以開始寫詳細(xì)的登錄和查詢數(shù)據(jù)過程了

2. 登錄和驗(yàn)證

執(zhí)行數(shù)據(jù)庫語句需要使用到sqlcommand類铐然,然后構(gòu)造sqlcommand中的參數(shù),然后進(jìn)行數(shù)據(jù)讀取恶座,可寫成如下形式:

                    SqlConnection LoginConnectResult = null;//定義一個(gè)sqlconnection類型
                    OpenSQLSERVER OSS = new OpenSQLSERVER();
                    LoginConnectResult = OSS.Start();//打開數(shù)據(jù)庫
                    SqlCommand SQLCMD = LoginConnectResult.CreateCommand();//創(chuàng)建command
                    SQLCMD.CommandType = CommandType.Text;//command類型為text搀暑,也就是sql語句
                    SQLCMD.CommandText = $"select UserName from Super_Info";//執(zhí)行查詢操作
                    SqlDataReader UnameRead = SQLCMD.ExecuteReader();//執(zhí)行操作,此操作可以讀取到返回的數(shù)據(jù)
                    if (UnameRead.Read())
                     {
                            string ReaderUserName = UnameRead["UserName"].ToString();//取出字段數(shù)據(jù)
                            //Read方法返回?cái)?shù)據(jù)跨琳,如果可以接著讀取證明數(shù)據(jù)存在自点,此時(shí)可以取出數(shù)據(jù)
                      }
                        if (ReaderUserName == Login_Form_UserName.Text.Trim())//判斷是否和輸入相等
                        {
                            UnameRead.Close();//關(guān)閉上一個(gè)read流
                            SQLCMD.CommandText = "select PassWord from Super_Info";
                            SqlDataReader PassWordRead = SQLCMD.ExecuteReader();
                            if (PassWordRead.Read())
                            {
                                string ReaderPassWord = PassWordRead["PassWord"].ToString();//讀取密碼
                                if (ReaderPassWord == Login_Form_UserPassword.Text.Trim())//比對
                                {
                                    SMB.ShowInforMation("登錄成功", "提示");
                                    PassWordRead.Close();//關(guān)閉數(shù)據(jù)流
                                    LoginConnectResult.Close();//關(guān)閉數(shù)據(jù)庫連接,供其他類使用
                                    Hide();
                                    MemberInfoForm MIF = new MemberInfoForm();
                                    MIF.Show();//顯示會員信息窗口
                                }
                                else
                                {

                                    SMB.ShowError("密碼錯(cuò)誤,請重新登錄", "錯(cuò)誤");
                                }
                            }
                        }
                        else
                        {
                            SMB.ShowError("賬號錯(cuò)誤,請重新登錄", "錯(cuò)誤");
                        }

以上便是登錄驗(yàn)證的過程

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末脉让,一起剝皮案震驚了整個(gè)濱河市桂敛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌侠鳄,老刑警劉巖埠啃,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異伟恶,居然都是意外死亡碴开,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進(jìn)店門博秫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來潦牛,“玉大人,你說我怎么就攤上這事挡育“屯耄” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵即寒,是天一觀的道長橡淆。 經(jīng)常有香客問我,道長母赵,這世上最難降的妖魔是什么逸爵? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮凹嘲,結(jié)果婚禮上师倔,老公的妹妹穿的比我還像新娘。我一直安慰自己周蹭,他們只是感情好趋艘,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布疲恢。 她就那樣靜靜地躺著,像睡著了一般瓷胧。 火紅的嫁衣襯著肌膚如雪显拳。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天搓萧,我揣著相機(jī)與錄音萎攒,去河邊找鬼。 笑死矛绘,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的刃永。 我是一名探鬼主播货矮,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼斯够!你這毒婦竟也來了囚玫?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤读规,失蹤者是張志新(化名)和其女友劉穎抓督,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體束亏,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡铃在,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了碍遍。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片定铜。...
    茶點(diǎn)故事閱讀 38,064評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖怕敬,靈堂內(nèi)的尸體忽然破棺而出揣炕,到底是詐尸還是另有隱情,我是刑警寧澤东跪,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布畸陡,位于F島的核電站,受9級特大地震影響虽填,放射性物質(zhì)發(fā)生泄漏丁恭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一卤唉、第九天 我趴在偏房一處隱蔽的房頂上張望涩惑。 院中可真熱鬧,春花似錦桑驱、人聲如沸竭恬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽痊硕。三九已至赊级,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間岔绸,已是汗流浹背理逊。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留盒揉,地道東北人晋被。 一個(gè)月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像刚盈,于是被迫代替她去往敵國和親羡洛。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評論 2 345