今天在幫朋友改一cms時(shí)發(fā)現(xiàn)有些sql語帶有問號(hào)了,但個(gè)人壓根就沒見過這種寫法了,后來經(jīng)朋友的指點(diǎn)才知道原來sql 語句中的問號(hào)另有作用呀,下面我來介紹一下.
我看到的一個(gè)實(shí)例,代碼如下:
- String sql = "SELECT userid,name FROM tuser WHERE userid=? AND password=?" ;
- pstmt = conn.prepareStatement(sql) ;
- pstmt.setString(1,userid) ; // 這里設(shè)置了第一個(gè)?的值
- pstmt.setString(2,password) ; // 這里設(shè)置了第二個(gè)?的值
等你“setString”完所有的?后,你的sql就構(gòu)造好了,好了,如果說還是不懂我又找到一篇相關(guān)文章.
參考資料一,代碼如下:
select * from table where username='syy913'
username='syy913'
后面是個(gè)字符串,在數(shù)據(jù)庫里面采用的是當(dāng)引號(hào),有句口訣叫單單雙雙加加,單是用在數(shù)據(jù)庫里面的,雙是用在外部編程語言里面的,在c# java等語言是用的雙引號(hào)標(biāo)識(shí)的字符串,代碼如下:
string sql=”select * from table”;這就標(biāo)識(shí)一個(gè)字符串。
string sql=”select * from table”+”where id>0″;2個(gè)字符串連接
下面的,代碼如下:
string sql=”select * from table where id>0″+”and name=?”;
這個(gè)問號(hào)表示 要傳參數(shù),要在執(zhí)行這個(gè)sql前就必須把參數(shù)給他,上面的name是字符型的,你在看這樣寫什么意思,代碼如下:
string nn=”kill”//Vevb.com
string sql=”select * from table where id>0 and name=?”;
由于?代表的是一個(gè)字符串,我們把nn輸出來看,他是不到“”這個(gè)的,那么就應(yīng)該'nn'到數(shù)據(jù)庫去,即如下代碼:
string sql=”select * from table where id>0 and name='nn'”;
就可以了,為什么還要里面+個(gè)雙引號(hào)呢?代碼如下:
string sql=”select * from table where id>0 and name='”+nn+”‘”;
就把nn當(dāng)一個(gè)變量給他了.
參考資料二:這 個(gè)sql語句如果包含參數(shù)的話,可以用問號(hào)(”?”)來為參數(shù)進(jìn)行占位,而不需要立即為參數(shù)賦值,而在語句執(zhí)行之前,必須通過適當(dāng)?shù)膕et***()來 為問號(hào)處的參數(shù)賦值。New ParseInfo()中,包含了參數(shù)的sql語句就會(huì)被分解為多段,放在staticSql中,以便需要設(shè)置參數(shù)時(shí)定位參數(shù)的位置。假如sql語句為 “select * from adv where id = ? and name = ?”的話,那么staticSql中的元素就是3個(gè),staticSql[3]={ ”select * from adv where id = ”, ” and name = ” , ””}。注意數(shù)組中最后一個(gè)元素,在這個(gè)例子中是””,因?yàn)槲业睦永锩孀詈笠粋€(gè)就是”?”,如果sql語句是這樣的“select * from adv where id = ? and name = ? order by id”的話,staticSql就變成是這樣的{ ”select * from adv where id = ”, ” and name = ” , ” order by id”}。
無關(guān)參考三,mysql 手冊 c api 預(yù)處理語句.
25.2.7.4. mysql_stmt_bind_param()
my_bool mysql_stmt_bind_param(MYSQL_STMT *stmt, MYSQL_BIND *bind)
描述:mysql_stmt_bind_param()用于為SQL語句中的參數(shù)標(biāo)記符綁定數(shù)據(jù),以傳遞給mysql_stmt_prepare(),它使用MYSQL_BIND結(jié)構(gòu)來提供數(shù)據(jù),“bind”是MYSQL_BIND結(jié)構(gòu)的某一數(shù)組的地址,按照客戶端庫的預(yù)期,對(duì)于查詢中出現(xiàn)的每個(gè)“?”參數(shù)標(biāo)記符,數(shù)組中均包含1個(gè)元素.
假定你準(zhǔn)備了下述語句:
INSERT INTO mytbl VALUES(?,?,?)綁定參數(shù)時(shí),MYSQL_BIND結(jié)構(gòu)的數(shù)組包含3個(gè)元素,并能聲明如下:MYSQL_BIND bind[3];
新聞熱點(diǎn)
疑難解答
圖片精選