You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 00:27:01