1 /// <summary> 2 /// Performs an SQL update 3 /// </summary> 4 /// <param name="tableName">The name of the table to update</param> 5 /// <param name="primaryKeyName">The name of the primary key column of the table</param> 6 /// <param name="poco">The POCO object that specifies the column values to be updated</param> 7 /// <param name="primaryKeyValue">The primary key of the record to be updated</param> 8 /// <returns>The number of affected records</returns> 9 public int Update(string tableName, string primaryKeyName, object poco, object primaryKeyValue) 10 { 11 if (string.IsNullOrEmpty(tableName)) 12 throw new ArgumentNullException("tableName"); 13 14 if (string.IsNullOrEmpty(primaryKeyName)) 15 throw new ArgumentNullException("primaryKeyName"); 16 17 if (poco == null) 18 throw new ArgumentNullException("poco"); 19 20 return ExecuteUpdate(tableName, primaryKeyName, poco, primaryKeyValue, null); 21 } 22 23 /// <summary> 24 /// Performs an SQL update 25 /// </summary> 26 /// <param name="tableName">The name of the table to update</param> 27 /// <param name="primaryKeyName">The name of the primary key column of the table</param> 28 /// <param name="poco">The POCO object that specifies the column values to be updated</param> 29 /// <param name="primaryKeyValue">The primary key of the record to be updated</param> 30 /// <param name="columns">The column names of the columns to be updated, or null for all</param> 31 /// <returns>The number of affected rows</returns> 32 public int Update(string tableName, string primaryKeyName, object poco, object primaryKeyValue, IEnumerable<string> columns) 33 { 34 if (string.IsNullOrEmpty(tableName)) 35 throw new ArgumentNullException("tableName"); 36 37 if (string.IsNullOrEmpty(primaryKeyName)) 38 throw new ArgumentNullException("primaryKeyName"); 39 40 if (poco == null) 41 throw new ArgumentNullException("poco"); 42 43 return ExecuteUpdate(tableName, primaryKeyName, poco, primaryKeyValue, columns); 44 } 45 46 /// <summary> 47 /// Performs an SQL update 48 /// </summary> 49 /// <param name="tableName">The name of the table to update</param> 50 /// <param name="primaryKeyName">The name of the primary key column of the table</param> 51 /// <param name="poco">The POCO object that specifies the column values to be updated</param> 52 /// <returns>The number of affected rows</returns> 53 public int Update(string tableName, string primaryKeyName, object poco) 54 { 55 return Update(tableName, primaryKeyName, poco, null); 56 } 57 58 /// <summary> 59 /// Performs an SQL update 60 /// </summary> 61 /// <param name="tableName">The name of the table to update</param> 62 /// <param name="primaryKeyName">The name of the primary key column of the table</param> 63 /// <param name="poco">The POCO object that specifies the column values to be updated</param> 64 /// <param name="columns">The column names of the columns to be updated, or null for all</param> 65 /// <returns>The number of affected rows</returns> 66 public int Update(string tableName, string primaryKeyName, object poco, IEnumerable<string> columns) 67 { 68 if (string.IsNullOrEmpty(tableName)) 69 throw new ArgumentNullException("tableName"); 70 71 if (string.IsNullOrEmpty(primaryKeyName)) 72 throw new ArgumentNullException("primaryKeyName"); 73 74 if (poco == null) 75 throw new ArgumentNullException("poco"); 76 77 return ExecuteUpdate(tableName, primaryKeyName, poco, null, columns); 78 } 79 80 /// <summary> 81 /// Performs an SQL update 82 /// </summary> 83 /// <param name="poco">The POCO object that specifies the column values to be updated</param> 84 /// <param name="columns">The column names of the columns to be updated, or null for all</param> 85 /// <returns>The number of affected rows</returns> 86 public int Update(object poco, IEnumerable<string> columns) 87 { 88 return Update(poco, null, columns); 89 } 90 91 /// <summary> 92 /// Performs an SQL update 93 /// </summary> 94 /// <param name="poco">The POCO object that specifies the column values to be updated</param> 95 /// <returns>The number of affected rows</returns> 96 public int Update(object poco) 97 { 98 return Update(poco, null, null); 99 } 100 101 /// <summary> 102 /// Performs an SQL update 103 /// </summary> 104 /// <param name="poco">The POCO object that specifies the column values to be updated</param> 105 /// <param name="primaryKeyValue">The primary key of the record to be updated</param> 106 /// <returns>The number of affected rows</returns> 107 public int Update(object poco, object primaryKeyValue) 108 { 109 return Update(poco, primaryKeyValue, null); 110 } 111 112 /// <summary> 113 /// Performs an SQL update 114 /// </summary> 115 /// <param name="poco">The POCO object that specifies the column values to be updated</param> 116 /// <param name="primaryKeyValue">The primary key of the record to be updated</param> 117 /// <param name="columns">The column names of the columns to be updated, or null for all</param> 118 /// <returns>The number of affected rows</returns> 119 public int Update(object poco, object primaryKeyValue, IEnumerable<string> columns) 120 { 121 if (poco == null) 122 throw new ArgumentNullException("poco"); 123 124 var pd = PocoData.ForType(poco.GetType(), _defaultMapper); 125 return ExecuteUpdate(pd.TableInfo.TableName, pd.TableInfo.PrimaryKey, poco, primaryKeyValue, columns); 126 } 127 128 /// <summary> 129 /// Performs an SQL update 130 /// </summary> 131 /// <typeparam name="T">The POCO class who's attributes specify the name of the table to update</typeparam> 132 /// <param name="sql">The SQL update and condition clause (ie: everything after "UPDATE tablename"</param> 133 /// <param name="args">Arguments to any embedded parameters in the SQL</param> 134 /// <returns>The number of affected rows</returns> 135 public int Update<T>(string sql, params object[] args) 136 { 137 if (string.IsNullOrEmpty(sql)) 138 throw new ArgumentNullException("sql"); 139 140 var pd = PocoData.ForType(typeof(T), _defaultMapper); 141 return Execute(string.Format("UPDATE {0} {1}", _provider.EscapeTableName(pd.TableInfo.TableName), sql), args); 142 } 143 144 /// <summary> 145 /// Performs an SQL update 146 /// </summary> 147 /// <typeparam name="T">The POCO class who's attributes specify the name of the table to update</typeparam> 148 /// <param name="sql"> 149 /// An SQL builder object representing the SQL update and condition clause (ie: everything after "UPDATE 150 /// tablename" 151 /// </param> 152 /// <returns>The number of affected rows</returns> 153 public int Update<T>(Sql sql) 154 { 155 if (sql == null) 156 throw new ArgumentNullException("sql"); 157 158 var pd = PocoData.ForType(typeof(T), _defaultMapper); 159 return Execute(new Sql(string.Format("UPDATE {0}", _provider.EscapeTableName(pd.TableInfo.TableName))).Append(sql)); 160 } 161 162 private int ExecuteUpdate(string tableName, string primaryKeyName, object poco, object primaryKeyValue, IEnumerable<string> columns) 163 { 164 try 165 { 166 OpenSharedConnection(); 167 try 168 { 169 using (var cmd = CreateCommand(_sharedConnection, "")) 170 { 171 var sb = new StringBuilder(); 172 var index = 0; 173 var pd = PocoData.ForObject(poco, primaryKeyName, _defaultMapper); 174 if (columns == null) 175 { 176 foreach (var i in pd.Columns) 177 { 178 // Don't update the primary key, but grab the value if we don't have it 179 if (string.Compare(i.Key, primaryKeyName, true) == 0) 180 { 181 if (primaryKeyValue == null) 182 primaryKeyValue = i.Value.GetValue(poco); 183 continue; 184 } 185 186 // Dont update result only columns 187 if (i.Value.ResultColumn) 188 continue; 189 190 // Build the sql 191 if (index > 0) 192 sb.Append(", "); 193 sb.AppendFormat("{0} = {1}{2}", _provider.EscapeSqlIdentifier(i.Key), _paramPrefix, index++); 194 195 // Store the parameter in the command 196 AddParam(cmd, i.Value.GetValue(poco), i.Value.PropertyInfo); 197 } 198 } 199 else 200 { 201 foreach (var colname in columns) 202 { 203 var pc = pd.Columns[colname]; 204 205 // Build the sql 206 if (index > 0) 207 sb.Append(", "); 208 sb.AppendFormat("{0} = {1}{2}", _provider.EscapeSqlIdentifier(colname), _paramPrefix, index++); 209 210 // Store the parameter in the command 211 AddParam(cmd, pc.GetValue(poco), pc.PropertyInfo); 212 } 213 214 // Grab primary key value 215 if (primaryKeyValue == null) 216 { 217 var pc = pd.Columns[primaryKeyName]; 218 primaryKeyValue = pc.GetValue(poco); 219 } 220 } 221 222 // Find the property info for the primary key 223 PropertyInfo pkpi = null; 224 if (primaryKeyName != null) 225 { 226 PocoColumn col; 227 pkpi = pd.Columns.TryGetValue(primaryKeyName, out col) 228 ? col.PropertyInfo 229 : new { Id = primaryKeyValue }.GetType().GetProperties()[0]; 230 } 231 232 cmd.CommandText = string.Format("UPDATE {0} SET {1} WHERE {2} = {3}{4}", 233 _provider.EscapeTableName(tableName), sb.ToString(), _provider.EscapeSqlIdentifier(primaryKeyName), _paramPrefix, index++); 234 AddParam(cmd, primaryKeyValue, pkpi); 235 236 DoPreExecute(cmd); 237 238 // Do it 239 var retv = cmd.ExecuteNonQuery(); 240 OnExecutedCommand(cmd); 241 return retv; 242 } 243 } 244 finally 245 { 246 CloseSharedConnection(); 247 } 248 } 249 catch (Exception x) 250 { 251 if (OnException(x)) 252 throw; 253 return -1; 254 } 255 }