如何在onClick代码块中执行存储过程将用户名存入MSSQL数据库
实现方案说明
- 首先明确:不要将数据库连接、执行存储过程、关闭连接的全流程直接写在OnClickListener的主线程执行块中,Android 禁止主线程执行耗时网络操作(远程MSSQL连接属于这类操作),直接在主线程执行会触发ANR(应用无响应),需要放到后台线程执行。
- 你后续要扩展的参数校验、重复用户名校验逻辑,可以在触发后台数据库操作之前,先在OnClickListener里实现,校验通过再执行数据库操作即可。
前置依赖配置
首先在模块级build.gradle中引入MSSQL JDBC驱动依赖:
dependencies { // 其他已有依赖 implementation 'net.sourceforge.jtds:jtds:1.3.1' }
同时在AndroidManifest.xml中添加网络权限:
<uses-permission android:name="android.permission.INTERNET" />
布局文件示例(res/layout/activity_main.xml)
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="16dp"> <EditText android:id="@+id/et_username" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="请输入用户名" /> <Button android:id="@+id/btn_submit" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="submit" android:layout_marginTop="16dp"/> </LinearLayout>
核心逻辑代码(Kotlin 示例,基于协程实现后台操作)
import android.os.Bundle import android.widget.Button import android.widget.EditText import androidx.appcompat.app.AppCompatActivity import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import java.sql.Connection import java.sql.DriverManager import java.sql.CallableStatement class MainActivity : AppCompatActivity() { // 数据库连接配置,替换为你自己的实际配置 private val dbUrl = "jdbc:jtds:sqlserver://你的MSSQL服务器IP:端口号;databaseName=你的数据库名" private val dbUser = "数据库账号" private val dbPwd = "数据库密码" // 替换为你实际的存储过程名称,?对应用户名入参位置 private val addUserSP = "{call sp_AddNewUser(?)}" override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val etUsername = findViewById<EditText>(R.id.et_username) val btnSubmit = findViewById<Button>(R.id.btn_submit) btnSubmit.setOnClickListener { val inputUsername = etUsername.text.toString().trim() // 后续扩展的参数校验、重复校验逻辑可以写在此处 // 校验通过后触发后台数据库操作 CoroutineScope(Dispatchers.IO).launch { executeAddUserSP(inputUsername) } } } // 执行存储过程的方法,运行在IO线程 private fun executeAddUserSP(username: String) { var conn: Connection? = null var cs: CallableStatement? = null try { // 1. 打开数据库连接 conn = DriverManager.getConnection(dbUrl, dbUser, dbPwd) // 2. 绑定存储过程参数 cs = conn.prepareCall(addUserSP) cs.setString(1, username) // 3. 执行存储过程 cs.execute() } catch (e: Exception) { e.printStackTrace() // 需UI提示错误的话,可自行切回主线程操作 } finally { // 4. 关闭资源避免连接泄露 cs?.close() conn?.close() } } }
如果你使用Java开发,将协程部分替换为Thread或者WorkManager实现后台执行即可,JDBC操作存储过程的逻辑是通用的。
内容的提问来源于stack exchange,提问作者Zerrubabel
相关产品推荐
相关产品推荐

