设为首页 收藏本站
查看: 852|回复: 0

[经验分享] Android 连接 SQL Server (jtds方式)——下

[复制链接]

尚未签到

发表于 2017-7-13 09:17:20 | 显示全部楼层 |阅读模式
  本文主要补充介绍jtds的查询方法,将以博主的一个实际开发程序进行说明
  
  下图是项目的文件列表与界面效果:
   DSC0000.png           DSC0001.png
  
  运行效果:
    1、三个EditText对应的是单个计划的序号、品种名、数量
    2、填入三个数据后,点击“增加”,Insert到数据库中
    3、填入三个数据后,点击“修改”,根据序号,Update数据库中的品种名、数量
    4、填入序号后,点击“删除”,根据序号,Delete数据库中的一行记录
    5、点击“查询全部”,在下方GridView中显示整个表格的记录
    6、点击“清空”,三个EditText的内容清空,GridView的内容清空
  
  数据库信息:
    1、数据库名:SYSTEM TEST
    2、用户名:sa
    3、密码:123
    4、表名:DayPlan
    5、字段1:ID,nvarchar  =>表示序号
    6、字段2:PCBA,nvarchar  =>表示品种名
    7、字段3:AMOUNT,nvarchar  =>数量
  
  AndroidManifest.xml:



1 <?xml version="1.0" encoding="utf-8"?>
2 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
3     package="com.test.androidsqltest"
4     android:versionCode="1"
5     android:versionName="1.0" >
6     
7     <uses-permission android:name="android.permission.INTERNET" />
8
9     <uses-sdk
10         android:minSdkVersion="14"
11         android:targetSdkVersion="21" />
12
13     <application
14         android:allowBackup="true"
15         android:icon="@drawable/ic_launcher"
16         android:label="@string/app_name"
17         android:theme="@style/AppTheme" >
18         <activity
19             android:name=".MainActivity"
20             android:label="@string/app_name" >
21             <intent-filter>
22                 <action android:name="android.intent.action.MAIN" />
23
24                 <category android:name="android.intent.category.LAUNCHER" />
25             </intent-filter>
26         </activity>
27     </application>
28
29 </manifest>
    插入网络操作权限
  
strings.xml:



1 <?xml version="1.0" encoding="utf-8"?>
2 <resources>
3
4     <string name="app_name">AndroidSqlTest</string>
5     <string name="action_settings">Settings</string>
6     <string name="id">序  号:</string>
7     <string name="pcb">机种名:</string>
8     <string name="amount">数  量:</string>
9     <string name="insert">增加</string>   
10     <string name="update">修改</string>
11     <string name="delete">删除</string>
12     <string name="clear">清空</string>
13     <string name="select">查询全部</string>
14     
15 </resources>
  
  activity_main.xml:



  1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2     xmlns:tools="http://schemas.android.com/tools"
  3     android:layout_width="match_parent"
  4     android:layout_height="match_parent"
  5     android:paddingBottom="@dimen/activity_vertical_margin"
  6     android:paddingLeft="@dimen/activity_horizontal_margin"
  7     android:paddingRight="@dimen/activity_horizontal_margin"
  8     android:paddingTop="@dimen/activity_vertical_margin"
  9     tools:context="com.test.androidsqltest.MainActivity" >
10
11     <TextView
12         android:id="@+id/tvId"
13         android:layout_width="wrap_content"
14         android:layout_height="wrap_content"
15         android:layout_marginStart="10dp"
16         android:layout_marginLeft="10dp"
17         android:layout_marginTop="5dp"
18         android:text="@string/id" />
19
20     <TextView
21         android:id="@+id/tvPcb"
22         android:layout_width="wrap_content"
23         android:layout_height="wrap_content"
24         android:layout_marginStart="10dp"
25         android:layout_marginLeft="10dp"
26         android:layout_marginTop="45dp"
27         android:text="@string/pcb" />
28
29     <TextView
30         android:id="@+id/tvAmount"
31         android:layout_width="wrap_content"
32         android:layout_height="wrap_content"
33         android:layout_marginStart="10dp"
34         android:layout_marginLeft="10dp"
35         android:layout_marginTop="85dp"
36         android:text="@string/amount" />
37
38     <EditText
39         android:id="@+id/etId"
40         android:layout_width="wrap_content"
41         android:layout_height="wrap_content"
42         android:layout_marginStart="70dp"
43         android:layout_marginLeft="70dp"
44         android:layout_marginTop="-5dp"
45         android:inputType="text"
46         android:ems="10" >
47
48         <requestFocus />
49     </EditText>
50
51     <EditText
52         android:id="@+id/etPcb"
53         android:layout_width="wrap_content"
54         android:layout_height="wrap_content"
55         android:layout_marginStart="70dp"
56         android:layout_marginLeft="70dp"
57         android:layout_marginTop="35dp"
58         android:inputType="text"
59         android:ems="10" />
60
61     <EditText
62         android:id="@+id/etAmount"
63         android:layout_width="wrap_content"
64         android:layout_height="wrap_content"
65         android:layout_marginStart="70dp"
66         android:layout_marginLeft="70dp"
67         android:layout_marginTop="75dp"
68         android:inputType="text"
69         android:ems="10" />
70
71     <Button
72         android:id="@+id/btnInsert"
73         android:layout_width="80dp"
74         android:layout_height="40dp"
75         android:layout_marginStart="5dp"
76         android:layout_marginLeft="5dp"
77         android:layout_marginTop="120dp"
78         android:text="@string/insert" />
79
80     <Button
81         android:id="@+id/btnUpdate"
82         android:layout_width="80dp"
83         android:layout_height="40dp"
84         android:layout_marginStart="105dp"
85         android:layout_marginLeft="105dp"
86         android:layout_marginTop="120dp"
87         android:text="@string/update" />
88
89     <Button
90         android:id="@+id/btnDelete"
91         android:layout_width="80dp"
92         android:layout_height="40dp"
93         android:layout_marginStart="205dp"
94         android:layout_marginLeft="205dp"
95         android:layout_marginTop="120dp"
96         android:text="@string/delete" />
97
98     <Button
99         android:id="@+id/btnClear"
100         android:layout_width="120dp"
101         android:layout_height="40dp"
102         android:layout_marginStart="5dp"
103         android:layout_marginLeft="5dp"
104         android:layout_marginTop="180dp"
105         android:text="@string/clear" />
106
107     <Button
108         android:id="@+id/btnSelect"
109         android:layout_width="120dp"
110         android:layout_height="40dp"
111         android:layout_marginStart="165dp"
112         android:layout_marginLeft="165dp"
113         android:layout_marginTop="180dp"
114         android:text="@string/select" />
115
116     <GridView
117         android:id="@+id/gv"
118         android:layout_width="match_parent"
119         android:layout_height="wrap_content"
120         android:layout_centerHorizontal="true"
121         android:layout_marginTop="240dp"
122         android:numColumns="1"
123         android:verticalSpacing="15dp" >
124     </GridView>
125
126 </RelativeLayout>
  
planlist.xml:



1 <?xml version="1.0" encoding="utf-8"?>
2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3     android:orientation="horizontal"
4     android:layout_width="fill_parent"
5     android:layout_height="fill_parent" >
6     
7     <TextView android:id="@+id/header1"
8       android:layout_height="wrap_content"
9       android:layout_width="60px"
10       android:layout_marginLeft="0px"
11       android:textColor="#000000"
12       android:text="">
13    </TextView>
14   
15     <TextView android:id="@+id/header2"
16       android:layout_height="wrap_content"
17       android:layout_width="180px"
18       android:layout_marginLeft="0px"
19       android:textColor="#000000"
20       android:text="">
21    </TextView>
22   
23    <TextView android:id="@+id/header3"
24       android:layout_height="wrap_content"
25       android:layout_width="80px"
26       android:layout_marginLeft="0px"
27       android:textColor="#000000"
28       android:text="">
29    </TextView>
30   
31 </LinearLayout>
    这是GridView中单个item的布局,即一行记录有3个TextView
  
SqlHelper.java:



  1 package MyJtds;
  2
  3 import java.sql.Connection;
  4 import java.sql.DriverManager;
  5 import java.sql.PreparedStatement;
  6 import java.sql.ResultSet;
  7 import java.sql.ResultSetMetaData;
  8 import java.sql.SQLException;
  9 import java.util.List;
10
11 import org.json.JSONArray;
12 import org.json.JSONObject;
13
14 public class SqlHelper {
15     private String drive = "net.sourceforge.jtds.jdbc.Driver";
16     private String connStr;
17     private String server;
18     private String dbName;
19     private String userName;
20     private String userPwd;
21     private Connection con;
22     private PreparedStatement pstm;
23
24     public SqlHelper(String server, String dbName, String userName, String userPwd) {
25         this.server = server;
26         this.dbName = dbName;
27         this.connStr = "jdbc:jtds:sqlserver://" + this.server + ":1433/" + this.dbName;
28         this.userName = userName;
29         this.userPwd = userPwd;
30
31         try {
32             Class.forName(drive);
33         } catch (ClassNotFoundException e) {
34             // TODO Auto-generated catch block
35             e.printStackTrace();
36         }
37     }
38
39     public int ExecuteNonQuery(String sql, List<Object> params) {
40         try {
41             con = DriverManager.getConnection(this.connStr, this.userName, this.userPwd);
42             pstm = con.prepareStatement(sql);
43             if (params != null && !params.equals("")) {
44                 for (int i = 0; i < params.size(); i++) {
45                     pstm.setObject(i + 1, params.get(i));
46                 }
47             }
48             return pstm.executeUpdate();
49         } catch (Exception e) {
50             // TODO: handle exception
51             e.printStackTrace();
52             return -1;
53         } finally {
54             try {
55                 pstm.close();
56                 con.close();
57             } catch (SQLException e) {
58                 // TODO Auto-generated catch block
59                 e.printStackTrace();
60             }
61         }
62     }
63
64     public String ExecuteQuery(String sql, List<Object> params) {
65         // TODO Auto-generated method stub
66         JSONArray jsonArray = new JSONArray();
67         try {
68             con = DriverManager.getConnection(this.connStr, this.userName, this.userPwd);
69             pstm = con.prepareStatement(sql);
70             if (params != null && !params.equals("")) {
71                 for (int i = 0; i < params.size(); i++) {
72                     pstm.setObject(i + 1, params.get(i));
73                 }
74             }
75             ResultSet rs = pstm.executeQuery();
76             ResultSetMetaData rsMetaData = rs.getMetaData();
77             while (rs.next()) {
78                 JSONObject jsonObject = new JSONObject();
79                 for (int i = 0; i < rsMetaData.getColumnCount(); i++) {
80                     String columnName = rsMetaData.getColumnLabel(i + 1);
81                     String value = rs.getString(columnName);
82                     jsonObject.put(columnName, value);
83                 }
84                 jsonArray.put(jsonObject);
85             }
86             return jsonArray.toString();
87         } catch (Exception e) {
88             // TODO: handle exception
89             return null;
90         } finally {
91             try {
92                 pstm.close();
93                 con.close();
94             } catch (SQLException e) {
95                 // TODO Auto-generated catch block
96                 e.printStackTrace();
97             }
98         }
99     }
100 }
  
Plan.java:



1 package Models;
2
3 public class Plan {
4     public String id;
5
6     public String pcb;
7
8     public String amount;
9
10     public String getId() {
11         return id;
12     }
13
14     public void setId(String id) {
15         this.id = id;
16     }
17
18     public String getPcb() {
19         return pcb;
20     }
21
22     public void setPcb(String pcb) {
23         this.pcb = pcb;
24     }
25
26     public String getAmount() {
27         return amount;
28     }
29
30     public void setAmount(String amount) {
31         this.amount = amount;
32     }
33 }
  
MainActivity.java:



  1 package com.test.androidsqltest;
  2
  3 import java.lang.reflect.Type;
  4 import java.util.ArrayList;
  5 import java.util.HashMap;
  6 import java.util.List;
  7 import java.util.Map;
  8
  9 import com.google.gson.Gson;
10 import com.google.gson.reflect.TypeToken;
11
12 import Models.Plan;
13 import MyJtds.SqlHelper;
14 import android.annotation.SuppressLint;
15 import android.app.Activity;
16 import android.os.Bundle;
17 import android.os.Handler;
18 import android.os.Message;
19 import android.view.Menu;
20 import android.view.MenuItem;
21 import android.view.View;
22 import android.view.View.OnClickListener;
23 import android.widget.Button;
24 import android.widget.EditText;
25 import android.widget.GridView;
26 import android.widget.SimpleAdapter;
27 import android.widget.Toast;
28
29 public class MainActivity extends Activity {
30
31     // 定义控件
32     private EditText etId;
33     private EditText etPcb;
34     private EditText etAmount;
35     private Button btnInsert;
36     private Button btnUpdate;
37     private Button btnDelete;
38     private Button btnClear;
39     private Button btnSelect;
40     private GridView gv;
41     // 定义变量
42     private String id = "";
43     private String pcb = "";
44     private String amount = "";
45     // SQL帮助类,参数用于设置连接字符串,参数1:主机ip,参数2:数据库名,参数3:用户名,参数4:用户密码
46     private SqlHelper sh = new SqlHelper("192.168.1.1", "SYSTEM TEST", "sa", "123");
47
48     @Override
49     protected void onCreate(Bundle savedInstanceState) {
50         super.onCreate(savedInstanceState);
51         setContentView(R.layout.activity_main);
52
53         // 找到变量,并且赋值
54         etId = (EditText) findViewById(R.id.etId);
55         etPcb = (EditText) findViewById(R.id.etPcb);
56         etAmount = (EditText) findViewById(R.id.etAmount);
57         btnInsert = (Button) findViewById(R.id.btnInsert);
58         btnUpdate = (Button) findViewById(R.id.btnUpdate);
59         btnDelete = (Button) findViewById(R.id.btnDelete);
60         btnClear = (Button) findViewById(R.id.btnClear);
61         btnSelect = (Button) findViewById(R.id.btnSelect);
62         gv = (GridView) findViewById(R.id.gv);
63
64         // 绑定按钮的click事件监听,click事件触发后,运行clickEvent()方法
65         // 绑定的方式都是clickEvent(),到时在方法体中判断按下的是哪个按键
66         btnInsert.setOnClickListener(clickEvent());
67         btnUpdate.setOnClickListener(clickEvent());
68         btnDelete.setOnClickListener(clickEvent());
69         btnClear.setOnClickListener(clickEvent());
70         btnSelect.setOnClickListener(clickEvent());
71     }
72
73     // clickEvent()
74     private OnClickListener clickEvent() {
75         // TODO Auto-generated method stub
76         return new OnClickListener() {
77
78             // clickEvent()方法体,参数是控件的基类View,必须加上final
79             @Override
80             public void onClick(final View view) {
81                 // TODO Auto-generated method stub
82                 // 用view来判断按下的哪个按钮
83                 if (view == btnClear) {
84                     // ClearEdit()方法用于复位控件
85                     ClearEdit();
86                 } else {
87                     // 如果不是btnClear,那就是增删改查的按钮,必须开启新的线程进行操作
88                     Thread thread = new Thread(new Runnable() {
89                         @Override
90                         public void run() {
91                             // TODO Auto-generated method stub
92                             // 通过Message类来传递结果值,先实例化
93                             Message msg = Message.obtain();
94                             // 下面分别是增删改查方法
95                             if (view == btnInsert) {
96                                 // 设定msg的类型,用what属性,便于后面的代码区分返回的结果是什么类型
97                                 // 这里的1是指操作是否成功,String
98                                 // 这里的2是指查询的结果,String,用json的形式表示
99                                 msg.what = 1;
100                                 msg.obj = Insert();
101                             } else if (view == btnUpdate) {
102                                 msg.what = 1;
103                                 msg.obj = Update();
104                             } else if (view == btnDelete) {
105                                 msg.what = 1;
106                                 msg.obj = Delete();
107                             } else if (view == btnSelect) {
108                                 String jsonResult = Select();
109                                 msg.what = 2;
110                                 msg.obj = jsonResult;
111                             } else {
112
113                             }
114                             // 执行完以后,把msg传到handler,并且触发handler的响应方法
115                             handler.sendMessage(msg);
116                         }
117                     });
118                     // 进程开始,这行代码不要忘记
119                     thread.start();
120                 }
121             }
122         };
123     }
124
125     // Handler类用于接收Message的值,并且其父类有一个默认的handleMessage方法,用super。handleMessage()方法,传入msg,就能控制主线程的控件了
126     @SuppressLint("HandlerLeak")
127     private Handler handler = new Handler() {
128         public void handleMessage(Message msg) {
129             // 调用super的方法,传入handler对象接收到的msg对象
130             super.handleMessage(msg);
131             // 判断msg.what的值,有1和2,
132             // 1表示操作是否成功,2表示查询时得到的json结果
133             switch (msg.what) {
134             case 1:
135                 // 获得执行的结果,String字符串,返回操作是否成功提示
136                 String rst = msg.obj.toString();
137                 // 使用气泡提示
138                 Toast.makeText(getApplicationContext(), rst, Toast.LENGTH_SHORT).show();
139                 break;
140             case 2:
141                 // 获得查询的json结果
142                 String jsonResult = msg.obj.toString();
143                 // 控制台输出,用于监视,与实际使用无关
144                 System.out.println(jsonResult);
145
146                 // Gson类,用于json的转类型操作
147                 Gson gson = new Gson();
148                 // 定义查询到的结果类型,每一行记录映射为对象,本程序查询的是生产计划,所以一行记录表示一个品种的生产计划,用Plan类表示,用List收集全部Plan类
149                 Type type = new TypeToken<List<Plan>>() {
150                 }.getType();
151                 // 使用gson的fromJson()方法,参数1:json结果,参数2:想要转哪一个类型
152                 List<Plan> plans = gson.fromJson(jsonResult, type);
153
154                 // 由于要使用GridView表示,绑定数据时只能使用Map<K,T>的类型,并且多个记录时,要用List<Map<K,T>>
155                 // 先实例化
156                 List<Map<String, String>> mPlans = new ArrayList<Map<String, String>>();
157                 // 实例化一个title,是GridView的列头
158                 Map<String, String> title = new HashMap<String, String>();
159                 title.put("id", "序号");
160                 title.put("pcb", "机种名");
161                 title.put("amount", "计划数");
162                 // 首先把表头追加到List<Map<String, String>>
163                 mPlans.add(title);
164
165                 // for循环从json转过来的List<Plan>
166                 for (Plan plan : plans) {
167                     // 实例化用于接收plan的HashMap<K,T>类
168                     HashMap<String, String> hmPlans = new HashMap<String, String>();
169                     // 使用put()方法把数值加入到HashMap<K,T>,参数1:键,参数2:值
170                     hmPlans.put("id", plan.id);
171                     hmPlans.put("pcb", plan.pcb);
172                     hmPlans.put("amount", plan.amount);
173                     // 把HashMap加入到List<Map>中
174                     mPlans.add(hmPlans);
175                 }
176
177                 // SimpleAdapter是GridView的适配器,参数1:上下文内容,参数2:List<Map<K,T>>对象,参数3:GridView的布局文件,指每一个item的布局,需要在res/layout中创建xml,
178                 // 参数4:String数组,指每一列要绑定到Map中的值,数组中的值就是上文“hmPlans.put("id",
179                 // plan.id);”的键"id"
180                 // 参数5:列头的显示文件,存放在res/values/strings.xml
181                 SimpleAdapter sa = new SimpleAdapter(getApplicationContext(), mPlans, R.layout.planlist,
182                         new String[] { "id", "pcb", "amount" }, new int[] { R.id.header1, R.id.header2, R.id.header3 });
183                 // 把SimpleAdapter绑定到GridView
184                 gv.setAdapter(sa);
185
186                 // 气泡提示
187                 Toast.makeText(getApplicationContext(), "读取成功!", Toast.LENGTH_SHORT).show();
188                 break;
189             default:
190                 Toast.makeText(getApplicationContext(), "操作失败!", Toast.LENGTH_SHORT).show();
191                 break;
192             }
193         }
194     };
195
196     // 用于接收EditText的输入值,并赋值到字符串
197     public void GetMsg() {
198         id = etId.getText().toString().trim();
199         pcb = etPcb.getText().toString().trim();
200         amount = etAmount.getText().toString().trim();
201     }
202
203     // Insert()方法,通过判断受影响行数,返回“添加成功”或“操作失败”
204     public String Insert() {
205         String sql = "INSERT INTO [DayPlan]([ID],[PCBA],[AMOUNT]) VALUES (?,?,?)";
206         GetMsg();
207         List<Object> params = new ArrayList<Object>();
208         params.add(id);
209         params.add(pcb);
210         params.add(amount);
211         try {
212             int count = sh.ExecuteNonQuery(sql, params);
213             if (count == 1) {
214                 return "添加成功!";
215             } else {
216                 return "操作失败!";
217             }
218         } catch (Exception e) {
219             // TODO Auto-generated catch block
220             System.out.println(e.getMessage());
221             return "操作失败!";
222         }
223     }
224
225     public String Update() {
226         String sql = "UPDATE [DayPlan] SET [PCBA]=?,[AMOUNT]=? where [ID]=?";
227         GetMsg();
228         // params用于存放变量参数,即sql中的“?”
229         List<Object> params = new ArrayList<Object>();
230         params.add(pcb);
231         params.add(amount);
232         params.add(id);
233         try {
234             int count = sh.ExecuteNonQuery(sql, params);
235             if (count == 1) {
236                 return "更新成功!";
237             } else {
238                 return "操作失败!";
239             }
240         } catch (Exception e) {
241             // TODO: handle exception
242             System.out.println(e.getMessage());
243             return "操作失败!";
244         }
245     }
246
247     public String Delete() {
248         String sql = "DELETE FROM [DayPlan] where [ID]=?";
249         GetMsg();
250         List<Object> params = new ArrayList<Object>();
251         params.add(id);
252         try {
253             int count = sh.ExecuteNonQuery(sql, params);
254             if (count == 1) {
255                 return "删除成功!";
256             } else {
257                 return "操作失败!";
258             }
259         } catch (Exception e) {
260             // TODO: handle exception
261             System.out.println(e.getMessage());
262             return "操作失败!";
263         }
264     }
265
266     // Select()方法,查询生产计划
267     public String Select() {
268         String sql = "SELECT [ID] AS id,[PCBA] AS pcb,[AMOUNT] AS amount FROM [DayPlan] ORDER BY id";
269         String jsonResult = null;
270         try {
271             // sh.ExecuteQuery(),参数1:查询语句,参数2:查询用到的变量,用于本案例不需要参数,所以用空白的new
272             // ArrayList<Object>()
273             jsonResult = sh.ExecuteQuery(sql, new ArrayList<Object>());
274         } catch (Exception e) {
275             // TODO: handle exception
276             System.out.println(e.getMessage());
277             return null;
278         }
279         return jsonResult;
280     }
281
282     // 界面复位,清空显示
283     public void ClearEdit() {
284         //清空文本输入框
285         etId.setText("");
286         etPcb.setText("");
287         etAmount.setText("");
288         //etId获得焦点
289         etId.setFocusable(true);
290         etId.setFocusableInTouchMode(true);
291         etId.requestFocus();
292         etId.requestFocusFromTouch();
293         //清空GridView的绑定值
294         gv.setAdapter(null);
295     }
296
297     @Override
298     public boolean onCreateOptionsMenu(Menu menu) {
299         // Inflate the menu; this adds items to the action bar if it is present.
300         getMenuInflater().inflate(R.menu.main, menu);
301         return true;
302     }
303
304     @Override
305     public boolean onOptionsItemSelected(MenuItem item) {
306         // Handle action bar item clicks here. The action bar will
307         // automatically handle clicks on the Home/Up button, so long
308         // as you specify a parent activity in AndroidManifest.xml.
309         int id = item.getItemId();
310         if (id == R.id.action_settings) {
311             return true;
312         }
313         return super.onOptionsItemSelected(item);
314     }
315 }
  
  完成。
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-393382-1-1.html 上篇帖子: SQL Server行转列 下篇帖子: SQL Server的AlwaysOn错误19456和41158
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表