iT邦幫忙

1

android studio 呼叫 mySQL stored procedures 時出現錯誤

使用android studio(3.5) 呼叫 mySQL stored procedures時出現錯誤(若僅執行單行可正常使用,但多行無法一次執行):
https://ithelp.ithome.com.tw/upload/images/20191101/20114714o3d3mZgEMc.png

以下為文件內容:

Android studio main_activity.java(部分)

        @Override
        protected String doInBackground(String... strings) {
            try{
                Class.forName("com.mysql.jdbc.Driver");
                Connection con = DriverManager.getConnection(url, user, pass);
                String result ="";
                Statement st = con.createStatement();
                ResultSet rs = st.executeQuery("call login(@fname, '"+account+"', '"+password+"'); select @fname;");

                ResultSetMetaData rsmd = rs.getMetaData();

                while(rs.next()){
                    result += rs.getString("fname").toString()+"您好!";
                }
                res = result;

            }catch (Exception e){
                e.printStackTrace();
                res = e.toString();
            }
            return res;
        }

mySQL stored procedures:

CREATE DEFINER=`currency`@`%` PROCEDURE `login`(out fname varchar(5), in acc varchar(100), in pwd varchar(50))
BEGIN
	Declare exist int;
    select count(*) into exist from client where account = acc and code = pwd;
    if exist = 0 then
		set fname = '遊客';
	else
		select f_name into fname from client where account = acc and code = pwd;
	End IF;

END

補充:
目前已經用以下方法暫時繞過問題了,但各位大大要是有更好的方法也歡迎留言喔!:

CallableStatement cstmt = con.prepareCall("{call login(?,?,?)}");
                    cstmt.registerOutParameter(1, Types.VARCHAR);
                    cstmt.setString(2, account);
                    cstmt.setString(3, password);
                    cstmt.executeUpdate();

2 個回答

0
小魚
iT邦大師 1 級 ‧ 2019-11-01 19:21:59

一般建議Android跟IOS不要直接操作資料庫.
比較有安全上的顧慮.

ericbig66 iT邦新手 5 級 ‧ 2019-11-01 20:36:42 檢舉

之後應該會更改成用jsp做連接,目前階段僅作為測試之用

0
海綿寶寶
iT邦大神 1 級 ‧ 2019-11-01 22:30:52

錯誤訊息是SQL 語法錯誤
你檢查看看

ResultSet rs = st.executeQuery("call login(@fname, '"+account+"', '"+password+"'); select @fname;");

實際上執行是

call login('@fname值', 'account值', 'password值');
select @fname;

1.以上SQL敍述語法是否正確?(可以貼在 SQL GUI 試試看)
2.會回傳你預期的 resultset 嗎?

選我正解

ericbig66 iT邦新手 5 級 ‧ 2019-11-01 23:29:51 檢舉

這串是直接從mySQL裡的GUI執行結果中擷取的喔!
目前使用的mySQL為5.7版

那有另一個可能
就是 account / password 在實際執行時的值造成的
可以把實際執行時的值(最後組成的去執行的 SQL 敍述)顯示出來
然後貼去 SQL GUI 執行看看
這樣最準

ericbig66 iT邦新手 5 級 ‧ 2019-11-02 22:41:53 檢舉

連接是正常的,單純執行select條件句都是可以的,直接複製實際輸出結果貼入Workbench也是可以執行的

我要發表回答

立即登入回答