Ruby连接使用windows下sql server数据库代码实例

时间:2021-10-17 11:28:27
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
require 'win32ole'
 
class SqlServer
  # This class manages database connection and queries
  attr_accessor :connection, :data, :fields
 
  def initialize
    @connection = nil
    @data = nil
  end
 
  def open
    # Open ADO connection to the SQL Server database
    connection_string = "Provider=SQLOLEDB.1;"
    connection_string << "Persist Security Info=False;"
    connection_string << "User ID=USER_ID;"
    connection_string << "password=PASSWORD;"
    connection_string << "Initial Catalog=DATABASE;"
    connection_string << "Data Source=IP_ADDRESS;"
    connection_string << "Network Library=dbmssocn"
    @connection = WIN32OLE.new('ADODB.Connection')
    @connection.Open(connection_string)
  end
 
  def query(sql)
    # Create an instance of an ADO Recordset
    recordset = WIN32OLE.new('ADODB.Recordset')
    # Open the recordset, using an SQL statement and the
    # existing ADO connection
    recordset.Open(sql, @connection)
    # Create and populate an array of field names
    @fields = []
    recordset.Fields.each do |field|
      @fields << field.Name
    end
    begin
      # Move to the first record/row, if any exist
      recordset.MoveFirst
      # Grab all records
      @data = recordset.GetRows
    rescue
      @data = []
    end
    recordset.Close
    # An ADO Recordset's GetRows method returns an array
    # of columns, so we'll use the transpose method to
    # convert it to an array of rows
    @data = @data.transpose
  end
 
  def close
    @connection.Close
  end
end

测试代码如下:

?
1
2
3
4
5
6
db = SqlServer.new
db.open
db.query("SELECT PLAYER FROM PLAYERS WHERE TEAM = 'REDS';")
field_names = db.fields
players = db.data
db.close
?
1
2
3
4
5
6
7
8
db = SqlServer.new('localhost', 'sa', 'SOMEPASSWORD')
db.open('Northwind')
db.query("SELECT * from Customers;")
puts field_names = db.fields
cust = db.data
puts cust.size
puts cust[0].inspect
db.close

抄到的别人版本的:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
MSSQL
require "dbi"
require "win32ole"
WIN32OLE.codepage = WIN32OLE::CP_UTF8
require 'iconv'
Re_cn=/[\x7f-\xff]/
 
class MssqlDb
 attr_accessor :mdb, :connection, :data, :fields
 
 def initialize(host,mdb,user,pass)
  @host= host
  @mdb=@database= mdb
  @username= user
  @password= pass
  @connection = nil
  @data = nil
  @fields = nil
 end
 
 def open 
  connection_string = "Provider=SQLOLEDB.1;User ID=@username;password=@password;Data Source=@host,1433;Initial Catalog=@mdb"
  @connection = WIN32OLE.new('ADODB.Connection')
  @connection.Open(connection_string)
   @password=''
 end
 
 def query(sql)
  recordset = WIN32OLE.new('ADODB.Recordset')
  recordset.Open(sql, @connection)
  @fields = []
  recordset.Fields.each do |field|
   @fields << field.Name
  end
  begin
   @data = recordset.GetRows.transpose
  rescue
   @data = []
  end
  recordset.Close
 end
 
 def queryGB(sql)
  if sql=~ Re_cn
  sql = utf8_to_gb(sql)
  end
  recordset = WIN32OLE.new('ADODB.Recordset')
  recordset.Open(sql, @connection)
  @fields = []
  recordset.Fields.each do |field|
   @fields << field.Name
  end
  begin
   @data = recordset.GetRows.transpose
  rescue
   @data = []
  end
  recordset.Close
 end
 
 def execute(sql)
  @connection.Execute(sql)
 end
 
 def executeGB(sql)
  if sql=~ Re_cn
  sql = utf8_to_gb(sql)
  end
  @connection.Execute(sql)
 end
 
 def close
  @connection.Close
 end
  
 def utf8_to_gb(s)
  p 'conv to gb18030'
  Iconv.conv("GB18030//IGNORE","UTF-8//IGNORE",s)
 end
 def gb_to_utf8(s)
  p 'conv to utf8'
  Iconv.conv("UTF-8//IGNORE","GB18030//IGNORE",s)
 end
end
 
 
 
 
 
 
ACCESS
require "win32ole"
class AccessDb
  attr_accessor :mdb, :connection, :data, :fields
 
  def initialize(mdb=nil)
    @mdb = mdb
    @connection = nil
    @data = nil
    @fields = nil
  end
 
  def open
    connection_string = 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source='
    connection_string << @mdb
    @connection = WIN32OLE.new('ADODB.Connection')
    @connection.Open(connection_string)
        p 'access open ok.'
  end
 
  def query(sql)
    recordset = WIN32OLE.new('ADODB.Recordset')
    recordset.Open(sql, @connection)
    @fields = []
    recordset.Fields.each do |field|
      @fields << field.Name
    end
    begin
      @data = recordset.GetRows.transpose
    rescue
      @data = []
    end
    recordset.Close
  end
 
  def execute(sql)
    @connection.Execute(sql)
  end
 
  def close
    @connection.Close
  end
end